分析使用反应器/ websockets和线程的应用程序

时间:2015-05-20 19:52:23

标签: python autobahn yappi

您好我写了一个应该无人值守的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(),但由于此代码永远不会执行,因此我永远不会执行它。

那么如何分析这样的程序呢?

此致

1 个答案:

答案 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()通过事件描述和您的性能分析函数调用。