我想在课堂上进行多重处理。似乎只有pathos.multiprocessing能够帮助我。但是,当我实现它时,它无法加载我在main函数中使用的包。
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。
答案 0 :(得分:2)
我是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
>>>
问题是multiprocessing
在窗口上根本不同,因为窗口没有真正的fork
...因此不像具有{的系统那样灵活{1}}。 fork
有一个分叉的pickler,它会产生multiprocessing
...而非Windows系统可以在整个过程中使用共享内存。
subprocess
有一个dill
和一个check
方法,可以在某些copy
上执行顺序loads(dumps(object))
,其中object
使用共享内存,虽然copy
使用check
(正如subprocess
中的窗口所做的那样)。这是Mac上的multiprocessing
方法,显然这不是问题。
check
您需要在Windows上执行的另一件事是在>>> import dill
>>> dill.check(t.func)
<bound method tester.func of <__main__.tester instance at 0x1051c7998>>
的开头使用freeze_support
(即__main__
的第一行)。在非Windows系统上它是不必要的,但在Windows上几乎是必要的。这是文档。
__main__