有没有办法衡量 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 读取的速度以及 block 大小,我的子进程可能会在等待数据时无所事事。我可以测量这个吗?
到目前为止,我最好的猜测是将 cProfile.runctx 包裹在 a_slow_function 周围。这会为每个工作人员生成一个配置文件,然后我可以将其与脚本的总运行时间进行比较。但是,do_something_with(foo) 可能会扭曲结果,所以我必须考虑到这一点。有没有更简洁的方法来做到这一点?
注意:我不介意解决方案是否涉及特定于 linux 的工具。
请您参考如下方法:
你可以试试 line_profiler,一个线路分析器,来获取时间
for foo in pool.imap_unordered(a_slow_function, f, chunksize=100)
行和 a_slow_function 中的求和时间,然后比较 那些 两个数字。
我不确定这是否是一个好的想法,但它仍然是一个想法。
你也可以尝试单独计时,比如看看你能多快阅读文件中的行:
例如。
for line in f: pass
