2012-04-03 44 views
2

我正在尝试使用并行Python进行一些非常简单的操作。我希望能够从一个类中创建一个对象,这个类是在一个类的另一个方法内创建的,并行地完成一项工作。 这里是想我,使工作一个基本的例子:并行Python - 在并行执行中将对象创建到另一个类

import pp 

class TestClass(object): 
    def __init__(self): 
     pass 
    def doSomething (self, number) : 
     print number**2 

class PPTask (object) : 
    def __init__ (self) : 
     pass 
    def ppTask(self, number = 1) : 
     sum = 0 
     sum += number 
     tc = TestClass() 
     tc.doSomething(sum) 
     return sum 

if __name__ == '__main__' : 
    job_server = pp.Server() 
    job_list = [] 
    results = [] 
    for i in xrange(10) : 
     pt = PPTask() 
     job_list.append(job_server.submit(pt.ppTask, (1,), globals = globals())) 
    for job in job_list : 
     results.append(job()) 
    for result in results : 
     print result 

这提高NameError: global name 'TestClass' is not defined,我没有找到任何解决方案,通过它,或在ppTask方法重用。

任何帮助将大大appriciated。

预先感谢您

回答

1

一个解决办法是告诉作业服务器导入源模块本身对于您所提交每个作业。例如,如果你的脚本上面被称为pptest.py,您可以创建工作,像这样:

job_list.append(job_server.submit(pt.ppTask, (1,), modules=('pptest',))) 

并在ppTask,那么你可以TestClass像这样:

tc = pptest.TestClass() 

所以,总体来说,代码看起来像这样:

import pp 

class TestClass(object): 
    def __init__(self): 
     pass 
    def doSomething (self, number) : 
     print number**2 

class PPTask (object) : 
    def __init__ (self) : 
     pass 
    def ppTask(self, number = 1) : 
     sum = 0 
     sum += number 
     tc = pptest.TestClass() 
     tc.doSomething(sum) 
     return sum 

if __name__ == '__main__' : 
    job_server = pp.Server() 
    job_list = [] 
    results = [] 
    for i in xrange(10) : 
     pt = PPTask() 
     job_list.append(job_server.submit(pt.ppTask, (1,), modules=('pptest',))) 
    for job in job_list : 
     results.append(job()) 
    for result in results : 
     print result 
+0

谢谢,它运作良好。我仍然不明白如何使用PP提交方法处理全局变量。我确实尝试通过globals = {'TestClass':}在一个词典中传递TestClass,我不知道为什么这不起作用。 – 2012-04-04 07:04:58

+0

是的,我也试过,但无法让它工作。这看起来应该是_should_,但我对“pp”没有足够的了解。我以前从来没有遇到过这种情况,因为我通常将单独的类放在单独的模块文件中,并且只需使用'module'关键字参数给'Server.submit()'告诉作业要导入的内容。 – 2012-04-04 12:14:39