2016-12-06 63 views
0

如何獲得以下功能?重點是我想異步運行一個方法(而不是一個函數)。我可以將方法傳遞給apply_async或map在python多處理中嗎?

from multiprocessing import Pool 

class Async: 
    def __init__(self, pool): 
     self.pool = pool 
     self.run() 

    def run(self): 
     p.apply_async(self.f, (10,)) 

    def f(self, x): 
     print x*x 

if __name__ == '__main__': 
    p = Pool(5) 
    a = Async(p) 
    p.close() 
    p.join() 

這不打印任何東西。

+0

適當添加a.run()。 – Simon

+0

修正了運行方法。我發現這個可能的解決方案:http://stackoverflow.com/q/1816958/1545579必須嘗試...也許它有幫助...將更新 – Mahdi

回答

0

這個問題似乎是由於該multiprocessing需要醃製self.f同時綁定方法不是picklable的事實。有關於如何解決問題的討論here

apply_async顯然會創建一個異常,並將其放入未來。這就是爲什麼沒有打印。如果未來執行get,則會引發異常。

0

它絕對有可能在python 2中使用線程池的線程類方法 - 下面的程序做了我所期望的。

#!/usr/bin/env python 

from multiprocessing.pool import ThreadPool 

class TestAsync(): 
    def __init__(self): 
    pool = ThreadPool(processes = 2) 

    async_completions = [] 
    for a in range(2): 
     async_completions.append(pool.apply_async(self.print_int, ( a,))) 

    for completion in async_completions: 
     res = completion.get() 
     print("res = %d" % res) 

    def print_int(self, value): 
    print(value) 
    return (value*10) 


a = TestAsync() 
+0

謝謝@fankster。它確實有效。唯一的問題是,據我所知,ThreadPool將仍然使用一個「進程」(換句話說,將只運行在一個核心上)。如果這不是問題,那麼你的答案會很有幫助,但我想在多個內核上運行。 – Mahdi

相關問題