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 を数個作るのを並行処理みたいなことはできない。
というかしようと思ったんだけど、どうやらこの手段では無理っぽい。