2012-04-03 27 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

相關問題