澄清:根据一些评论,我应该澄清这是一个简单的框架,旨在允许执行本质上是并行的程序(所谓的尴尬的并行程序)。它不是,也永远不会成为需要进程间通信或同步的任务的解决方案。
我一直在寻找一个简单的基于进程的Python并行编程环境,可以在集群上的多个CPU上执行函数,主要标准是需要能够执行未修改的Python代码。我找到的最接近的是Parallel Python,但pp做了一些相当奇怪的事情,可能导致代码未在正确的上下文中执行(导入了适当的模块等)。
最后,我厌倦了搜索,所以决定写自己的。我想出的实际上非常简单。问题是,我不确定我想出的东西是否简单,因为我可能没有考虑到很多事情。这是我的程序做的事情:
如有建议或批评,将不胜感激。
编辑:我应该提到,我已经让代码执行了,但服务器和作业服务器还没有编写。
我一直在寻找一个简单的基于进程的Python并行编程环境,可以在集群上的多个CPU上执行函数,主要标准是需要能够执行未修改的Python代码。我找到的最接近的是Parallel Python,但pp做了一些相当奇怪的事情,可能导致代码未在正确的上下文中执行(导入了适当的模块等)。
最后,我厌倦了搜索,所以决定写自己的。我想出的实际上非常简单。问题是,我不确定我想出的东西是否简单,因为我可能没有考虑到很多事情。这是我的程序做的事情:
- I have a job server which hands out jobs to nodes in the cluster.
The jobs are handed out to servers listening on nodes by passing a dictionary that looks like this:
{ '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
andfuncName
are mandatory, and the others are optional.A node server takes this dictionary and does:
sys.path.append(modulePath) globals()[moduleName]=__import__(moduleName, localVars, globalVars) returnVal = globals()[moduleName].__dict__[funcName](*args, **kwargs)
On getting the return value, the server then sends it back to the job server which puts it into a thread-safe queue.
- When the last job returns, the job server writes the output to a file and quits.
__import__
的优点在于模块中的代码会自动运行,因此函数应该在正确的上下文中执行。如有建议或批评,将不胜感激。
编辑:我应该提到,我已经让代码执行了,但服务器和作业服务器还没有编写。
import
语句失败。我认为问题在于pp尝试在“干净”的环境中执行函数,并期望您明确指定代码所依赖的所有模块、需要调用的设置代码等。使用pp编写简单的程序很容易,但编写复杂的程序则很困难。 - Chinmay Kanchi