日別アーカイブ: 2018/01/24

multiprocessing, staticmethod

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