如何在Python中让多进程函数返回和存储值?

2024-10-04 11:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,我将运行多处理。然而,函数返回一个值,我不知道如何存储该值一旦完成

我在网上的某个地方读到过关于使用队列的文章,但我不知道如何实现它,也不知道这是否可行

cores = []
for i in range(os.cpu_count()):
    cores.append(Process(target=processImages, args=(dataSets[i],))) 
for core in cores: 
    core.start()
for core in cores:
    core.join()

其中函数“processImages”返回一个值。如何保存返回值


Tags: 函数incorefor队列oscount地方
3条回答

不能从另一个进程返回变量。建议的方法是创建一个Queue(multiprocessing.Queue),然后让您的子进程将结果放入该队列,一旦完成,您可以将它们读回,如果您有很多结果,这种方法很有效

如果您只需要一个数字,那么使用ValueArray可能会更简单

请记住,您不能使用简单的变量,它必须用multiprocessinglib中的上述类进行包装

如果要使用多处理返回的结果object,请尝试以下操作

from multiprocessing.pool import ThreadPool


def fun(fun_argument1, ... , fun_argumentn):
    <blabla>
    return object_1, object_2


pool = ThreadPool(processes=number_of_your_process)
async_num1 = pool.apply_async(fun, (fun_argument1, ... , fun_argumentn))
object_1, object_2 = async_num1.get()

那你想干什么就干什么

在您的代码片段中,您输入了数据集,这是一个未指定大小的列表。您有一个函数processImages,它接受一个dataSet元素并返回一个您想要捕获的值

cpu计数==数据集长度

我注意到的第一个问题是os.cpu\u count()驱动值的范围I,然后决定处理哪些数据集。我假设你更喜欢这两件事是独立的。也就是说,您希望能够处理X个数量的数据集,并且希望它能够在任何一台机器上工作,具有1-1000(或更多)个内核

关于CPU受限工作的旁白

我还要假设您已经确定任务确实是CPU受限的,因此按核心划分是有意义的。相反,如果任务是磁盘io绑定的,则需要更多的工作线程。也可以是内存绑定或缓存绑定。如果最佳并行化对您很重要,那么您应该考虑做一些试验,看看哪些工作线程的数量真正为您提供了最佳性能

如果你愿意,这里有更多的reading

池类

不管怎样,正如Michael Butscher所提到的,Pool类为您简化了这个过程。你的是一个标准用例。您有一组要做的工作(您要处理的数据集列表)和许多要做的工作(在您的代码片段中,您的核心数)

TLDR公司

使用以下简单的多处理概念:

 from multiprocessing import Pool

 # Renaming this variable just for clarity of the example here
 work_queue = datasets

 # This is the number you might want to find experimentally. Or just run with cpu_count()
 worker_count = os.cpu_count()

 # This will create processes (fork) and join all for you behind the scenes
 worker_pool = Pool(worker_count)

 # Farm out the work, gather the results. Does not care whether dataset count equals cpu count
 processed_work = worker_pool.map(processImages, work_queue)

 # Do something with the result
 print(processed_work)

相关问题 更多 >