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

时间:2010-11-01 22:40:30

标签: python parallel-processing python-2.x

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

我一直在寻找一个简单的基于流程的并行编程环境,它可以在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,...}
    }
    
  • moduleNamefuncName是强制性的,其他是可选的。

  • 节点服务器接受此字典并执行:

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

  • 当最后一个作业返回时,作业服务器将输出写入文件并退出。

我确信需要解决这些问题,但这种方法有什么明显的错误吗?乍一看,它似乎很健壮,只需要节点可以访问包含.py文件和依赖项的文件系统。使用__import__的优点是模块中的代码会自动运行,因此函数应该在正确的上下文中执行。

任何建议或批评都将不胜感激。

编辑:我应该提一下,我的代码执行位工作正常,但服务器和作业服务器尚未编写。

2 个答案:

答案 0 :(得分:8)

我实际上写了一些可能满足你需求的东西:jug。如果它没有解决你的问题,我保证你会解决你找到的任何错误。

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

答案 1 :(得分:5)

我自己一直在修补我的计算机上的批处理图像操作,而我最大的问题是有些东西不容易或本地腌制并通过网络传输。

例如:pygame的表面不会发泡。这些我必须通过将它们保存在StringIO对象中然后通过网络转储它来转换为字符串。

如果您传输的数据(例如您的参数)可以毫无顾虑地传输,那么您不应该 网络数据存在许多问题。

另一件事让我想到:如果计算机在执行任务时突然“消失”,您打算做什么?在返回数据的同时?你有重新发送任务的计划吗?