Zac*_*aro 9 python profiling cprofile
我有一个简单的生产者消费者模式在我的gui代码中设置.我试图仅描述特定的消费者部分,看看是否有任何优化机会.但是,当我尝试运行代码时,python -m cProfile -o out.txt myscript.py我收到了Python pickle模块抛出的错误.
File "<string>", line 1, in <module>
File "c:\python27\lib\multiprocessing\forking.py", line 374, in main
self = load(from_parent)
File "c:\python27\lib\pickle.py", line 1378, in load
return Unpickler(file).load()
File "c:\python27\lib\pickle.py", line 858, in load
dispatch[key](self)
File "c:\python27\lib\pickle.py", line 880, in load_eof
raise EOFError
EOFError
Run Code Online (Sandbox Code Playgroud)
代码中的基本模式是
class MyProcess(multiprocessing.Process):
def __init__(self, in_queue, msg_queue):
multiprocessing.Process.__init__(self)
self.in_queue = in_queue
self.ext_msg_queue = msg_queue
self.name == multiprocessing.current_process().name
def run(self):
## Do Stuff with the queued items
Run Code Online (Sandbox Code Playgroud)
这通常是从GUI端提供的任务,但出于测试目的,我将其设置如下.
if __name__ == '__main__':
queue = multiprocessing.Queue()
meg_queue = multiprocessing.Queue()
p = Grabber(queue)
p.daemon = True
p.start()
time.sleep(20)
p.join()
Run Code Online (Sandbox Code Playgroud)
但在尝试启动脚本时,我收到上述错误消息.
有没有解决错误的方法?
以我的理解,该cProfile模块multiprocessing在命令行上不能很好地使用。(请参阅Python多进程分析。)
解决此问题的一种方法是从代码内运行探查器-特别是,您需要为池中的每个进程设置一个不同的探查器输出文件。您可以通过致电轻松完成此操作cProfile.runctx('a+b', globals(), locals(), 'profile-%s.out' % process_name)。
http://docs.python.org/2/library/profile.html#module-cProfile