2

有没有办法衡量每个子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. 这会为每个工作人员生成一个配置文件,然后我可以将其与脚本的总运行时间进行比较。但是,do_something_with(foo)可能会扭曲结果,所以我必须考虑到这一点。有没有更清洁的方法来做到这一点?

注意:我不介意解决方案是否涉及特定于 linux 的工具。

4

1 回答 1

1

你可以尝试line_profiler,一个线分析器,以获得时间

for foo in pool.imap_unordered(a_slow_function, f, chunksize=100)

线和里面的总和时间a_slow_function,然后比较两个数字。

我不确定这是否是一个主意,但它仍然是一个主意。


您也可以尝试单独计时,例如查看读取文件中行的速度:

例如。

for line in f: pass
于 2013-09-20T16:14:35.360 回答