我有一个函数,我将运行多处理。然而,函数返回一个值,我不知道如何存储该值一旦完成
我在网上的某个地方读到过关于使用队列的文章,但我不知道如何实现它,也不知道这是否可行
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”返回一个值。如何保存返回值
不能从另一个进程返回变量。建议的方法是创建一个
Queue
(multiprocessing.Queue),然后让您的子进程将结果放入该队列,一旦完成,您可以将它们读回,如果您有很多结果,这种方法很有效如果您只需要一个数字,那么使用
Value
或Array
可能会更简单请记住,您不能使用简单的变量,它必须用
multiprocessing
lib中的上述类进行包装如果要使用多处理返回的结果
object
,请尝试以下操作那你想干什么就干什么
在您的代码片段中,您输入了数据集,这是一个未指定大小的列表。您有一个函数processImages,它接受一个dataSet元素并返回一个您想要捕获的值
cpu计数==数据集长度
我注意到的第一个问题是os.cpu\u count()驱动值的范围I,然后决定处理哪些数据集。我假设你更喜欢这两件事是独立的。也就是说,您希望能够处理X个数量的数据集,并且希望它能够在任何一台机器上工作,具有1-1000(或更多)个内核
关于CPU受限工作的旁白
我还要假设您已经确定任务确实是CPU受限的,因此按核心划分是有意义的。相反,如果任务是磁盘io绑定的,则需要更多的工作线程。也可以是内存绑定或缓存绑定。如果最佳并行化对您很重要,那么您应该考虑做一些试验,看看哪些工作线程的数量真正为您提供了最佳性能
如果你愿意,这里有更多的reading
池类
不管怎样,正如Michael Butscher所提到的,Pool类为您简化了这个过程。你的是一个标准用例。您有一组要做的工作(您要处理的数据集列表)和许多要做的工作(在您的代码片段中,您的核心数)
TLDR公司
使用以下简单的多处理概念:
相关问题 更多 >
编程相关推荐