澄清:根据一些评论,我应该澄清这是一个简单的框架,允许执行自然并行的程序(所谓的)令人尴尬的并行程序)。它不是,也永远不会是需要在进程之间进行通信或同步的任务的解决方案。
我一直在寻找一个简单的基于流程的并行编程环境,它可以在Python上的多个CPU上执行函数,主要标准是它需要能够执行未经修改的Python代码。我发现的最接近的是Parallel 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文件和依赖项的文件系统。使用__import__
的优点是模块中的代码会自动运行,因此函数应该在正确的上下文中执行。
任何建议或批评都将不胜感激。
编辑:我应该提一下,我的代码执行位工作正常,但服务器和作业服务器尚未编写。
答案 0 :(得分:8)
我实际上写了一些可能满足你需求的东西:jug。如果它没有解决你的问题,我保证你会解决你找到的任何错误。
架构略有不同:工作者都运行相同的代码,但它们有效地生成了一个类似的字典,并询问中央后端“这已经运行了吗?”。如果没有,他们运行它(也有一个锁定机制)。如果你在NFS系统上,后端可以只是文件系统。
答案 1 :(得分:5)
我自己一直在修补我的计算机上的批处理图像操作,而我最大的问题是有些东西不容易或本地腌制并通过网络传输。
例如:pygame的表面不会发泡。这些我必须通过将它们保存在StringIO对象中然后通过网络转储它来转换为字符串。
如果您传输的数据(例如您的参数)可以毫无顾虑地传输,那么您不应该 网络数据存在许多问题。
另一件事让我想到:如果计算机在执行任务时突然“消失”,您打算做什么?在返回数据的同时?你有重新发送任务的计划吗?