3

クラスでマルチプロセッシングを行いたい。pathos.multiprocessing だけが私を助けることができるようです。ただし、実装すると、メイン関数で使用するパッケージをロードできません。

from pathos.multiprocessing import ProcessingPool;
import time
import sys;
import datetime


class tester:
    def __init__(self):
        self.pool=ProcessingPool(2);

    def func(self,msg):
        print (str(datetime.datetime.now()));
        for i in xrange(1):
            print msg
            sys.stdout.flush();
        time.sleep(2)    

#----------------------------------------------------------------------
    def worker(self):
        """"""
        pool=self.pool
        for i in xrange(10):
               msg = "hello %d" %(i)
               pool.map(self.func,[i])
        pool.close()
        pool.join()
        time.sleep(40)



if __name__ == "__main__":
    print datetime.datetime.now();
    t=tester()
    t.worker()
    time.sleep(60);
    print "Sub-process(es) done."

間違っているのは、グローバル名 'datetime' が定義されていないことです。しかし、それはメイン関数で動作します! 私のシステムはWin7です。

4

1 に答える 1

4

の作者ですpathos。Windows 以外のシステムでコードを実行すると、インタープリターからでも問題なく動作します。(ファイルからも機能します)。

>>> from pathos.multiprocessing import ProcessingPool;
>>> import time
>>> import sys;
>>> import datetime
>>> class tester:
...     def __init__(self):
...         self.pool=ProcessingPool(2);
...     def func(self,msg):
...         print (str(datetime.datetime.now()));
...         for i in xrange(1):
...             print msg
...             sys.stdout.flush();
...         time.sleep(2)    
...     def worker(self):
...         """"""
...         pool=self.pool
...         for i in xrange(10):
...                msg = "hello %d" %(i)
...                pool.map(self.func,[i])
...         pool.close()
...         pool.join()
...         time.sleep(40)
... 
>>> datetime.datetime.now()
datetime.datetime(2015, 10, 21, 19, 24, 16, 131225)
>>> t = tester()
>>> t.worker()
2015-10-21 19:24:25.927781
0
2015-10-21 19:24:27.933611
1
2015-10-21 19:24:29.938630
2
2015-10-21 19:24:31.942376
3
2015-10-21 19:24:33.946052
4
2015-10-21 19:24:35.949965
5
2015-10-21 19:24:37.953877
6
2015-10-21 19:24:39.957770
7
2015-10-21 19:24:41.961704
8
2015-10-21 19:24:43.965193
9
>>>

問題は、multiprocessingWindows では が基本的に異なることです。つまり、Windows には true fork… がないため、. を持つシステムほど柔軟ではありませんfork。 非 Windows システムは、プロセス間で共有メモリを利用できますmultiprocessingsubprocess

dill一部の でシーケンシャルを実行するとcheckメソッドがあり、ここでは共有メモリを使用しますが、(のウィンドウで行われるように) を使用します。これはMacでの方法ですので、どうやらそれは問題ではありません。copyloads(dumps(object))objectcopychecksubprocessmultiprocessingcheck

>>> import dill
>>> dill.check(t.func)
<bound method tester.func of <__main__.tester instance at 0x1051c7998>>

Windows で行う必要があるもう 1 つのことはfreeze_support、の先頭__main__(つまり、の最初の行__main__) で使用することです。Windows 以外のシステムでは不要ですが、Windows ではほとんど必要です。これがドキュメントです。

>>> import pathos
>>> print pathos.multiprocessing.freeze_support.__doc__

    Check whether this is a fake forked process in a frozen executable.
    If so then run code specified by commandline and exit.

>>>
于 2015-10-21T18:41:32.770 に答える