Pathos 多处理不能调用类中的任何包和函数
Posted
技术标签:
【中文标题】Pathos 多处理不能调用类中的任何包和函数【英文标题】:Pathos multiprocessing can't call any package and function in the class 【发布时间】:2016-01-18 13:48:07 【问题描述】:我想在课堂上进行多处理。似乎只有 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."
错误是未定义全局名称“日期时间”。但它适用于主要功能! 我的系统是Win7。
【问题讨论】:
为什么不使用标准的multiprocessing
库?
多处理不能用于调用类函数
@RunpengChen 我和你有同样的问题。你最终是如何解决你的问题的? ***.com/questions/54693080/…
【参考方案1】:
我是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
在 Windows 上根本不同,因为 Windows 没有真正的 fork
……因此不如在具有 fork
的系统上灵活。 multiprocessing
有一个 fork pickler,它在幕后产生了一个 subprocess
... 而非 Windows 系统可以跨进程使用共享内存。
dill
有一个check
和一个copy
方法,它在一些object
上执行顺序loads(dumps(object))
,其中copy
使用共享内存,而check
使用subprocess
(就像这样在multiprocessing
的窗口上)。这是 mac 上的 check
方法,显然这不是问题。
>>> import dill
>>> dill.check(t.func)
<bound method tester.func of <__main__.tester instance at 0x1051c7998>>
在windows上你需要做的另一件事是在__main__
的开头使用freeze_support
(即__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.
>>>
【讨论】:
以上是关于Pathos 多处理不能调用类中的任何包和函数的主要内容,如果未能解决你的问题,请参考以下文章