繁体   English   中英

通过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_asyncmap比在池中的进程数量更多 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM