【发布时间】:2018-05-14 11:09:54
【问题描述】:
如何在 python3 中使用 pathos 而不是 multiprocessing 模块实现非守护进程?
更具体地说,我指的是: Python Process Pool non-daemonic?
这篇文章的答案是通过多处理模块实现非守护进程。不幸的是,这个模块不允许在其他对象中腌制 lambda 函数,但 pathos 在 Python 2 中可以:
#import multiprocessing
#import multiprocessing.pool
import pathos
#class NoDaemonProcess(multiprocessing.Process):
class NoDaemonProcess(pathos.multiprocessing.Pool.Process):
def _get_daemon(self):
return False
def _set_daemon(self, value):
pass
daemon = property(_get_daemon, _set_daemon)
#class NoDaemonPool(multiprocessing.pool.Pool):
class NoDaemonPool(pathos.multiprocessing.Pool):
Process = NoDaemonProcess
def myproc(args):
i, max_workers = args
#pool = multiprocessing.Pool(max_workers)
pool = pathos.pools.ProcessPool(max_workers)
l_args = [j for j in range(i)]
mysubproc = lambda x : x
print("myproc", l_args, pool.map(mysubproc, l_args))
return i
max_workers = [2, 1]
executor = NoDaemonPool(max_workers[0])
#executor = pathos.multiprocessing.Pool(max_workers[0])
l_args = [(i, max_workers[1]) for i in range(10)]
print(executor.map(myproc, l_args))
输出:
('myproc', [], [])
('myproc', [0, 1], [0, 1])
('myproc', [0], [0])
('myproc', [0, 1, 2], [0, 1, 2])
('myproc', [0, 1, 2, 3], [0, 1, 2, 3])
('myproc', [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5])
('myproc', [0, 1, 2, 3, 4], [0, 1, 2, 3, 4])
('myproc', [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6])
('myproc', [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7])
('myproc', [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
在 Python 3 中,pathos 模块已更改为 w.r.t。 Python 2,例如, pathos.multiprocessing.Pool.Process 不再是一个类,而是一个函数,因此不能再将它用于继承(见上文)。 - 我缺少任何悲伤的文档吗?
如何使上述代码在 Python 3 的 pathos 中工作?
作为上述特定示例的解决方法,可以简单地回退到多处理 NoDaemonPool 实现,并为守护程序子进程使用 pathos:
import multiprocessing
import multiprocessing.pool
import pathos
class NoDaemonProcess(multiprocessing.Process):
#class NoDaemonProcess(pathos.multiprocessing.Pool.Process):
def _get_daemon(self):
return False
def _set_daemon(self, value):
pass
daemon = property(_get_daemon, _set_daemon)
class NoDaemonPool(multiprocessing.pool.Pool):
#class NoDaemonPool(pathos.multiprocessing.Pool):
Process = NoDaemonProcess
def myproc(args):
i, max_workers = args
#pool = multiprocessing.Pool(max_workers)
pool = pathos.pools.ProcessPool(max_workers)
l_args = [j for j in range(i)]
mysubproc = lambda x : x
print("myproc", l_args, pool.map(mysubproc, l_args))
return i
max_workers = [2, 1]
executor = NoDaemonPool(max_workers[0])
#executor = pathos.multiprocessing.Pool(max_workers[0])
l_args = [(i, max_workers[1]) for i in range(10)]
print(executor.map(myproc, l_args))
但是,这种变通办法不是解决方案,因为 (i) 它的输入包括悲情和多重处理,更重要的是 (ii) 它将无法腌制,例如,如果 myproc 被定义为
myproc = lambda x : x
非常感谢, 最好的, 塞巴斯蒂安
【问题讨论】:
-
在提出问题之前,尽量具体一点,让人们知道您为解决问题所做的努力。
标签: python-3.x multiprocessing pool pathos