[英]Python multiprocessing Pool.apply_async with shared variables (Value)
[英]python 2.7 multiprocessing. pool.apply_async inside another pool.apply_async
python 2.7多处理。 pool.apply_async
另一个里面pool.apply_async
我有2个模块A和B。模块“ A”声明了一个大小为100的池,并使用pool.apply_async,
了模块“ B”中的函数“ BX”。 模块“ B”中的函数“ BX”创建另一个大小为n的池,并使用其pool.apply_async
另一个函数。
现在面临的这个问题是执行过程正好在声明模块“ B”中的池时停止/退出。 即在声明模块“ B”中的第二个池时,该模块位于模块“ A”的第一个池中。
关于在pool.apply_async中执行pool.apply_async的任何解决方案?
您必须执行类似我在下面显示的操作。 请注意,我使用了自己的multiprocessing
分支(称为pathos
),因为它提供了更好的序列化,使您能够从解释器运行,并且在创建和维护池方面更加有效。 但是,工作流程应大致与此处所示相同:
>>> import pathos as p
>>> tp1 = p.pools.ThreadPool(100)
>>> tp2 = p.pools.ThreadPool(50)
>>> import itertools as it
>>>
>>> res = tp1.amap(tp2.amap, it.repeat(lambda x:x**2), [range(10)]*5)
>>> ans = res.get()
>>> [v.get() for v in ans]
[[0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]]
需要注意的是amap
在pathos
是map_async
的multiprocessing
。 如果你只是想apply_async
,这是apipe
的pathos
。 然后关闭:
>>> tp1.close()
>>> tp2.close()
>>> tp1.join()
>>> tp2.join()
>>> # pathos has an additional shutdown step to clear the pool cache
>>> tp1.clear()
>>> tp2.clear()
因此,等效于apply_async
,它看起来像这样:
>>> tp1 = p.pools.ThreadPool(100)
>>> tp2 = p.pools.ThreadPool(50)
>>> tp1.apipe(tp2.apipe, lambda x:x**2, 10).get().get()
100
>>> tp1.close()
>>> tp2.close()
>>> tp1.join()
>>> tp2.join()
>>> tp1.clear()
>>> tp2.clear()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.