Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 写一个并行编程框架,我错过了什么?_Python_Parallel Processing_Python 2.x - Fatal编程技术网

Python 写一个并行编程框架,我错过了什么?

Python 写一个并行编程框架,我错过了什么?,python,parallel-processing,python-2.x,Python,Parallel Processing,Python 2.x,澄清:根据一些评论,我应该澄清,这是一个简单的框架,允许执行自然并行的程序(所谓尴尬的并行程序)。对于需要在进程之间进行通信或同步的任务,它不是也永远不会是一个解决方案 我一直在寻找一个简单的基于进程的Python并行编程环境,它可以在集群上的多个CPU上执行函数,主要标准是它需要能够执行未修改的Python代码。我发现的最接近的是,但是pp做了一些非常奇怪的事情,这可能导致代码不能在正确的上下文中执行(导入适当的模块等) 我终于厌倦了搜索,所以我决定写我自己的。我想到的其实很简单。问题是,我不

澄清:根据一些评论,我应该澄清,这是一个简单的框架,允许执行自然并行的程序(所谓尴尬的并行程序)。对于需要在进程之间进行通信或同步的任务,它不是也永远不会是一个解决方案

我一直在寻找一个简单的基于进程的Python并行编程环境,它可以在集群上的多个CPU上执行函数,主要标准是它需要能够执行未修改的Python代码。我发现的最接近的是,但是pp做了一些非常奇怪的事情,这可能导致代码不能在正确的上下文中执行(导入适当的模块等)

我终于厌倦了搜索,所以我决定写我自己的。我想到的其实很简单。问题是,我不确定我的想法是否简单,因为我没有想到很多事情。以下是我的程序的功能:

  • 我有一个作业服务器,它将作业分发给集群中的节点
  • 作业通过传递如下所示的字典分发给侦听节点的服务器:

    {
    'moduleName':'some_module', 
    'funcName':'someFunction', 
    'localVars': {'someVar':someVal,...}, 
    'globalVars':{'someOtherVar':someOtherVal,...}, 
    'modulePath':'/a/path/to/a/directory', 
    'customPathHasPriority':aBoolean, 
    'args':(arg1,arg2,...), 
    'kwargs':{'kw1':val1, 'kw2':val2,...}
    }
    
  • moduleName
    funcName
    是必需的,其他是可选的

  • 节点服务器使用此字典并执行以下操作:

    sys.path.append(modulePath)
    globals()[moduleName]=__import__(moduleName, localVars, globalVars)
    returnVal = globals()[moduleName].__dict__[funcName](*args, **kwargs)
    
  • 获取返回值后,服务器将其发送回作业服务器,作业服务器将其放入线程安全队列

  • 当最后一个作业返回时,作业服务器将输出写入文件并退出
我肯定有一些小问题需要解决,但是这种方法有什么明显的错误吗?乍一看,它似乎很健壮,只需要节点能够访问包含.py文件和依赖项的文件系统。使用
\uuuuu import\uuuu
的优点是模块中的代码会自动运行,因此函数应该在正确的上下文中执行

如有任何建议或批评,将不胜感激


编辑:我应该提到,我已经完成了代码执行部分的工作,但是服务器和作业服务器尚未编写。

我自己一直在修补计算机上的批处理图像操作,我最大的问题是,有些东西不容易或无法在本地通过网络进行pickle和传输

例如:pygame的表面不会被酸洗。我必须将它们保存在StringIO对象中,然后通过网络转储,从而将它们转换为字符串

如果您正在传输的数据(如您的论点)可以毫无恐惧地传输,那么网络数据就不会有那么多问题


另一件事浮现在脑海中:如果计算机在执行任务时突然“消失”,你打算怎么办?在返回数据时?你有重新发送任务的计划吗?

我实际上写了一些可能满足你需要的东西:。如果它不能解决你的问题,我保证我会修复你发现的任何错误


架构略有不同:工作人员都运行相同的代码,但他们有效地生成了一个类似的字典,并询问中央后端“是否已运行此功能?”。如果没有,他们运行它(也有一个锁定机制)。如果您在NFS系统上,后端可以是文件系统。

这是一个非常雄心勃勃的目标。你能把这变成一个问题吗?@katriealex:不,pp绝对不会做我想做的事。我花了数周的时间试图将我的程序塞进pp的范例中,并不断地遇到一个又一个错误。pp有一些非常奇怪的问题。例如,
import
语句在numpy库的深处发生了几次失败,但没有明显的原因。我认为问题在于pp试图在“干净”的环境中执行函数,并希望您明确指定代码所依赖的所有模块、需要调用的设置代码等。使用pp编写简单的程序很容易,编写非简单的程序很难。听起来有点像网格计算。你找了一些python网格解决方案吗?我不确定它的位置,但是你能解释一下为什么pp不能做你想要的吗?我被你的评论弄糊涂了;pp的工作方式是否与您想要的不同,或者它是否无法像广告中所宣传的那样工作?我现在正沉浸在一些pp代码中,我很想听到更多关于它的问题以及它是如何工作的。编辑:我知道什么是正确的地方;还有一个问题!我现在就去问。如果有许多群集节点,作业服务器(在您的方法中,也在JG中)可能会成为瓶颈。是的,我一直在考虑基本上每隔“x”秒轮询一次每个节点,如果一个节点不回答“y”连续轮询,将作业发送到完成的第一个节点,或者在另一个节点上生成新的服务器进程(用户将指定采用哪种替代方案)。我还需要一种合理的方法来处理节点上发生的错误和/或异常。如何处理“不可拼接”的参数是一个很好的问题,我怀疑这个问题没有一般的答案。编写一个简单地取消勾选参数的基本处理程序可能是一个好主意,但允许为特殊情况对其进行子类化。这看起来非常有趣。我会看一看,让你知道进展如何!不幸的是,由于JG控制工人的启动,这对我来说不是一个好的解决方案。我主要使用的集群使用SunGridEngine来调度作业,我不能允许在SGE调度程序之外生成进程。它实际上应该可以工作。您只需使用SGE调度程序启动“jug execute”作业(实际上这是我个人使用的设置!)。如果工作在不同的时间开始,它甚至可以工作。好吧,我一定是误解了文档。我真的没有时间去关注它