您如何配置使用多重处理(multiprocessing.Pool.map)的python模块,以便每个生成的进程也逐行进行配置。
当前,我使用line_profiler进行性能分析,但它不支持多处理。 有手动方法吗?或者也许使用其他工具?
答案 0 :(得分:0)
推荐的使用 line_profiler 的方法是将 @profile
添加到被分析的函数,然后运行 kernprof -v -l script.py
。将它与多处理模块一起使用时,这会导致如下错误:
Can't pickle <class '__main__.Worker'>: attribute lookup Worker on __main__ failed.
要解决此问题,我们必须在要分析的子流程中自行设置 line_profiler
,而不是通过 kernelprof
全局设置。
举个例子,假设我们想要分析我们的一个工作进程的 run
方法。这是设置:
import multiprocessing as mp
import line_profiler
class Worker(mp.Process):
def run(self):
prof = line_profiler.LineProfiler()
# Wrap all functions that you want to be profiled in this process
# These can be global functions or any class methods
# Make sure to replace instance methods on a class level, not the bound methods self.run2
Worker.run2 = prof(Worker.run2)
...
# run the main
self.run2()
# store stats in separate file for each process
prof.dump_stats('worker.lprof')
def run2(self):
# real run method renamed
...
现在运行脚本会生成一个配置文件,然后我们可以使用该文件进行可视化:
python -m line_profiler worker.lprof