Python多进程评测
我正在努力找出如何分析一个简单的多进程python脚本Python多进程评测,python,multiprocessing,cprofile,Python,Multiprocessing,Cprofile,我正在努力找出如何分析一个简单的多进程python脚本 import multiprocessing import cProfile import time def worker(num): time.sleep(3) print 'Worker:', num if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)
import multiprocessing
import cProfile
import time
def worker(num):
time.sleep(3)
print 'Worker:', num
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
cProfile.run('p.start()', 'prof%d.prof' %i)
我启动了5个进程,因此cProfile生成了5个不同的文件。在每个示例中,我希望看到我的方法“worker”运行大约需要3秒钟,但我只看到“start”方法中发生的事情
如果有人能给我解释一下,我将不胜感激
更新:基于公认答案的工作示例:
您正在分析流程启动,这就是为什么您只看到在
p.start()
中发生的事情,正如您所说,p.start()
在子流程启动后返回。您需要在worker
方法中进行评测,该方法将在子流程中调用。更改评测的源代码还不够酷。让我们看看您的代码应该是什么样子:
import multiprocessing
import time
def worker(num):
time.sleep(3)
print('Worker:', num)
if __name__ == '__main__':
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
processes.append(p)
for p in processes:
p.join()
我在这里添加了join
,这样您的主要流程将在退出之前等待您的员工
尝试使用viztracer
代替cProfile
通过pip Install viztracer
安装它。然后使用多进程功能
viztracer--log\u多处理您的脚本.py
它将生成一个html文件,显示时间轴上的每个进程。(使用AWSD缩放/导航)
当然,这包括一些您不感兴趣的信息(如实际的多处理库的结构)。如果你已经对此感到满意,你就可以走了。但是,如果您只希望函数worker()
有一个更清晰的图形。尝试log\u sparse
功能
首先,用@log\u sparse
from viztracer import log_sparse
@log_sparse
def worker(num):
time.sleep(3)
print('Worker:', num)
然后运行viztracer--log\u multiprocess--log\u sparse-your\u script.py
时间轴上将只显示您的辅助功能,时间为3秒。如果您有一个复杂的流程结构,并且您想要分析代码的特定部分,或者可能是流程的特定工作核心,您可以指向探查器在那里收集统计信息(请参阅启用和禁用方法)。这是您可以做的:
import cProfile
def my_particular_worker_code()
pr = cProfile.Profile()
pr.enable()
# Process stuff to be profiled
pr.disable()
pr.print_stats(sort='tottime') # sort as you wish
您也可以将报告放到文件中。Wow!我觉得很傻:)这太简单了。非常感谢你!当然,谢谢你的快速回复。谢谢你关心你的问题!你能举例说明如何做到这一点吗?@DavoudTaghawi Nejad看到问题中的“工作示例”。
import cProfile
def my_particular_worker_code()
pr = cProfile.Profile()
pr.enable()
# Process stuff to be profiled
pr.disable()
pr.print_stats(sort='tottime') # sort as you wish