Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多进程评测_Python_Multiprocessing_Cprofile - Fatal编程技术网

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,)

我正在努力找出如何分析一个简单的多进程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,))
        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