Python3 にて multiprocessing ではまったので覚書
#!/usr/bin/env python3 import multiprocessing def global_pool(num): """ return is a Python Type Onry """ return num class MpTest(): def __init__(self): self.n = 10 pool = multiprocessing.Pool() for num in range(10): #pool.apply_async(self.on_pool, args=(num,), callback=self.on_pool_result) # NG #pool.apply_async(global_pool, args=(num,), callback=self.on_pool_result) # OK pool.apply_async(self.static_pool, args=(num,), callback=self.on_pool_result) # OK pool.close() pool.join() def on_pool(self, num): """ Not Work """ return num @staticmethod def static_pool(num): """ OK """ return num def on_pool_result(self, result): print(result, end=",") if __name__ == '__main__': MpTest()
で。
ランダムな順に出力され並行処理されているのが確認できる。
Pool はインスタンスメソッドにはアクセスできないのね。
実は去年からドン詰まりしていたのがやっと解決。
グローバル関数にするのもアレだし、ってことで static にしてもイケた。
あぁ @staticmethod はこういう場合に使うんだな。
それより数値や文字列という Python の型しか戻せないのが痛い。
Gir で GdkPixbuf を数個作るのを並行処理みたいなことはできない。
というかしようと思ったんだけど、どうやらこの手段では無理っぽい。