有没有办法衡量multiprocessing.Pool
等待投入的每个子流程花费的时间与他们花费多少时间来处理数据?
让我们以一个简单的例子来并行处理文件的行:
from multiprocessing import Pool
pool = Pool(processes=16)
with open('a_large_file.txt', 'r') as f:
for foo in pool.imap_unordered(a_slow_function, f, chunksize=100)
do_something_with(foo)
根据a_slow_function
花费的时间,我们从f
读取的速度以及块大小,我的子流程可能会在等待数据时最终摆弄他们的拇指。我可以测量一下吗?
到目前为止,我最好的猜测是将cProfile.runctx
包裹在a_slow_function
附近。这会为每个worker生成一个配置文件,然后我可以将其与脚本的总运行时间进行比较。但是,do_something_with(foo)
可能会导致结果偏差,因此我必须考虑到这一点。有更清洁的方法吗?
注意:我不介意该解决方案是否涉及特定于Linux的工具。
答案 0 :(得分:1)
您可以尝试使用线路探查器line_profiler
来获取
for foo in pool.imap_unordered(a_slow_function, f, chunksize=100)
行和a_slow_function
内的总和时间,然后比较那些两个数字。
我不确定这是否是好的想法,但这仍是一个想法。
您也可以单独尝试计时,例如查看文件中读取行的速度:
例如
for line in f: pass