- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用多处理库来计算一些东西的程序。大约有 10K 个输入需要计算,每个输入需要 0.2 秒到 10 秒的时间。
我当前的方法使用池:
# Inputs
signals = [list(s) for s in itertools.combinations_with_replacement(possible_inputs, 3)]
# Compute
with mp.Pool(processes = N) as p:
p.starmap(compute_solutions, [(s, t0, tf, folder) for s in signals])
print (" | Computation done.")
我注意到,在最后检查 300/400 个输入时,程序变得慢了很多。我的问题是:Pool
和 starmap()
的行为如何?
根据我的观察,我相信如果我有 10K 个输入并且 N = 4
(4 个进程),那么前 2 500 个输入将分配给第一个进程,紧邻的 2 500 个输入将分配给第一个进程。其次,......每个进程都以串行方式处理其输入。这意味着如果某些进程先于其他进程清除了队列,它们就不会执行新任务。
这是正确的吗?
如果这是正确的,我怎样才能拥有一个可以用这个伪代码表示的更智能的系统:
workers = Initialize N workers
tasks = A list of the tasks to perform
for task in tasks:
if a worker is free:
submit task to this worker
else:
wait
感谢您的帮助:)
注意:不同的 map 功能之间有什么区别。我相信 map()
、imap_unordered()
、imap
、starmap
存在。
它们之间有什么区别,我们什么时候应该使用其中一种?
最佳答案
Which means that if some processes have cleared the Queue before others, they do not get new tasks to perform.
Is this correct?
没有。 multiprocess.Pool() 的主要目的是将传递的工作负载分散到其工作池中 - 这就是它附带所有这些映射选项的原因 - 其各种方法之间的唯一区别在于如何工作量实际上是分配的,以及如何收集由此产生的返回。
在您的情况下,您使用 [(s, t0, tf,folder) for s in Signals]
生成的迭代将具有其每个元素(最终取决于 信号
大小)发送到池中的下一个空闲工作线程(作为compute_solutions(s, t0, tf,folder)
调用),一次一个(或者如果则发送多个) chunksize
参数被传递),直到整个可迭代被耗尽。不过,您无法控制哪个工作人员执行哪个部分。
工作负载也可能不均匀分布 - 一个工作人员可能比另一个工作人员处理更多的条目,具体取决于资源使用情况、执行速度、各种内部事件...
但是,使用 multiprocessing.Pool
的 map
、imap
和 starmap
方法,您甚至会得到这样的错觉:并有序地传播,因为它们在内部同步每个工作线程的返回值以匹配 source 可迭代对象(即结果的第一个元素将包含被调用函数的返回结果与可迭代对象的第一个元素) )。如果您想了解下面实际发生的情况,您可以尝试这些方法的异步/无序版本。
因此,默认情况下您会获得更智能的系统,但您始终可以使用multiprocessing.Pool.apply_async()
如果您想完全控制您的工作人员池。
顺便说一句,如果您正在考虑优化对可迭代本身的访问(因为池映射选项将消耗其中的很大一部分),您可以检查 this answer .
最后,
What are the differences between them and when should we use one or the other?
不要在这里引用,请转到 official docs因为对它们之间的差异有很好的解释。
关于Pool/starmap 的 Python 多处理行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50373412/
我有一个可以并行运行多个查询的函数,但是我在使用 multiprocessing 运行我的函数时遇到了一些麻烦。我有这段代码: def run(args): query, cursor = a
我在尝试使用 multiprocessing.Pool.starmap 时遇到了一个奇怪的错误。重现错误所需的最少代码在这里: from multiprocessing import Pool # I
最初,对于我使用的代码,Pool.map 足以对我的代码进行线程化,因为只有一个参数(一个可迭代的)作为参数传入我的函数。现在,我需要将多个参数传递给该函数,但我在使用 Pool.starmap 时遇
是否有类似于 pools.starmap 的函数可以与字典列表一起使用? 代替 :pools.starmap(func, iterable_of_tuple) 你将会拥有:pools.starmapd
我正在使用多处理pool.starmap函数。我发现一个奇怪的问题。 from multiprocessing import Pool p = multiprocessing.Pool() NODE
我正在尝试一些网页抓取。我正在将包含 URL 的列表传递给 pool.starmap ,但我遇到了参数错误。显示我的代码的简化版本: 有人可以帮我解决这个问题吗?对不起,如果我做了一些愚蠢的事情。 f
我有一个使用多处理库来计算一些东西的程序。大约有 10K 个输入需要计算,每个输入需要 0.2 秒到 10 秒的时间。 我当前的方法使用池: # Inputs signals = [list(s) f
这个starmap示例程序按预期工作: import multiprocessing def main(): pool = multiprocessing.Pool(10) param
假设我有这两种方法来完成相同的任务: from multiprocessing import Pool pool = Pool(4) def func(*args): # do some sl
关于 this post 的第二个答案, 我试过下面的代码 from multiprocessing import Pool import numpy as np from itertools imp
所以我创建了一个多处理列表(特别是 multiprocessing.Pool().starmap())并希望减少其内存大小。名单如下: import sys import numpy as np fr
在回答问题时Clunky calculation of differences between an incrementing set of numbers, is there a more beau
我正在使用 Pool 对我的程序进行多线程处理,使用 starmap 来传递参数。 我被卡住了,因为我似乎无法找到一种方法来传递 kwargs 以及我在 starmap 函数中传递的 zip 数组。
我是一名优秀的程序员,十分优秀!