您好我写了一个应该无人值守的Python程序。它基本上做的是通过几个线程中的http get请求获取一些数据,并通过websockets和autobahn框架获取数据。运行它2天告诉我它有不断增长的内存需求,甚至没有任何通知就停止了。 文档说我必须在应用程序中运行reactor作为最后一行代码。
我读到yappi能够分析线程应用程序 这是一些伪代码
from autobahn.twisted.websocket import WebSocketClientFactory,connectWS
if __name__ == "__main__":
#setting up a thread
#start the thread
Consumer.start()
xfactory = WebSocketClientFactory("wss://url")
cex_factory.protocol = socket
## SSL client context: default
##
if factory.isSecure:
contextFactory = ssl.ClientContextFactory()
else:
contextFactory = None
connectWS(xfactory, contextFactory)
reactor.run()
yappi project site中的示例如下:
import yappi
def a():
for i in range(10000000): pass
yappi.start()
a()
yappi.get_func_stats().print_all()
yappi.get_thread_stats().print_all()
所以我可以将yappi.start()
放在yappi.get_func_stats().print_all()
之后yappi.get_thread_stats().print_all()
加reactor.run()
,但由于此代码永远不会执行,因此我永远不会执行它。
那么如何分析这样的程序呢?
此致
答案 0 :(得分:0)
可以通过以下方式使用扭曲的剖面仪:
twistd -n --profile=profiling_results.txt --savestats --profiler=hotshot your_app
hotshot是一个默认的探查器,你也可以使用cprofile。 或者你可以通过以下方式从你的python脚本运行twistd:
from twistd.scripts import run
run()
并通过sys.argv[1:1] = ["--profile=profiling_results.txt", ...]
向脚本添加必要的参数
毕竟你可以通过以下方式将hotshot格式转换为calltree:
hot2shot2calltree profiling_results.txt > calltree_profiling
并打开生成的calltree_profiling文件:
kcachegrind calltree_profiling
有一个用于分析异步执行时间twisted-theseus的项目 您还可以尝试使用pycharm工具:thread concurrency
此处有一个相关问题sof 您还可以通过以下方式运行您的功能:
reactor.callWhenRunning(your_function, *parameters_list)
或reactor.addSystemEventTrigger()
通过事件描述和您的性能分析函数调用。