![](/img/trans.png)
[英]How to get currently running processes names from multiprocessing module in python
[英]Managing Processes from Python multiprocessing module
所以我以为我最终会发布; 管理Process
工作者的正确方法是什么? 我尝试使用Pool
,但是我注意到我无法获得每个已完成过程的返回值。 我尝试使用回调,但也无法按预期工作。 我应该只用active_children ()
自己管理它们吗?
我的泳池代码:
from multiprocessing import *
import time
import random
SOME_LIST = []
def myfunc():
a = random.randint(0,3)
time.sleep(a)
return a
def cb(retval):
SOME_LIST.append(retval)
print("Starting...")
p = Pool(processes=8)
p.apply_async(myfunc, callback=cb)
p.close()
p.join()
print("Stopping...")
print(SOME_LIST)
我期望值列表; 但是我得到的只是工作者工作中要完成的最后一项:
$ python multi.py
Starting...
Stopping...
[3]
注意:答案不应该使用threading
模块; 原因如下:
在CPython中,由于使用了全局解释器锁,因此只有一个线程可以一次执行Python代码(即使某些面向性能的库可能克服了此限制)。 如果希望您的应用程序更好地利用多核计算机的计算资源,建议您使用多处理。
您误会了apply_async
工作方式。 它不会在Pool
中的每个进程中调用您传递给它的函数。 它只是在一个工作进程中一次调用函数。 因此,您所看到的结果是可以预期的。 您可以通过两种方法来获得所需的行为:
from multiprocessing import Pool
import time
import random
SOME_LIST = []
def myfunc():
a = random.randint(0,3)
time.sleep(a)
return a
def cb(retval):
SOME_LIST.append(retval)
print("Starting...")
p = Pool(processes=8)
for _ in range(p._processes):
p.apply_async(myfunc, callback=cb)
p.close()
p.join()
print("Stopping...")
print(SOME_LIST)
要么
from multiprocessing import Pool
import time
import random
def myfunc():
a = random.randint(0,3)
time.sleep(a)
return a
print("Starting...")
p = Pool(processes=8)
SOME_LIST = p.map(myfunc, range(p._processes))
p.close()
p.join()
print("Stopping...")
print(SOME_LIST)
请注意,您也可以拨打apply_async
或map
比在池中的进程数量更多 。 Pool
的想法是,无论提交多少任务,它都确保num_processes
进程在Pool
的整个生命周期中都将运行。 因此,如果您创建一个Pool(8)
并调用一次apply_async
,则您的八个工作apply_async
一个将获得任务,而其他七个工作apply_async
将处于空闲状态。 如果创建Pool(8)
并调用80次apply_async
,则这80个任务将分配给您的8个工作程序,一次实际处理的任务不超过8个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.