Python3 にて multiprocessing ではまったので覚書
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/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 を数個作るのを並行処理みたいなことはできない。
というかしようと思ったんだけど、どうやらこの手段では無理っぽい。