2016-12-06 7 views
0

次のように動作させるにはどうすればよいですか?要点は、非同期にメソッドを(そして関数ではなく)実行したいということです。apply_asyncにメソッドを渡したり、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がバインドメソッドはpickle化可能なない間self.fを酸洗する必要があるという事実のためであると思われます。この問題を解決する方法については、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は1つの "プロセス"(つまり、1つのコアでのみ実行されます)を使用することです。問題がなければ答えが役に立ちますが、複数のコアで実行したいと考えています。 – Mahdi

関連する問題