Профилирование приложения, которое использует реакторы / веб-сокеты и потоки
Привет, я написал программу на Python, которая должна работать без присмотра. По сути, он извлекает некоторые данные через http, получает запросы в нескольких потоках и извлекает данные через веб-сокеты и инфраструктуру autobahn. Запуск его в течение 2 дней показывает мне, что он имеет растущий спрос на память и даже останавливается без какого-либо уведомления. Документация говорит, что я должен запустить реактор как последнюю строчку кода в приложении.
Я читал, что 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 выглядит следующим образом:
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 ответ
Использовать профилировщики twistd можно следующим образом:
twistd -n --profile=profiling_results.txt --savestats --profiler=hotshot your_app
hotshot является профилировщиком по умолчанию, вы также можете использовать cprofile. Или вы можете запустить twistd из своего скрипта Python с помощью:
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: параллелизм потока
Здесь есть связанный вопрос, также вы можете запустить вашу функцию:
reactor.callWhenRunning(your_function, *parameters_list)
Или reactor.addSystemEventTrigger()
с описанием события и вызовом функции профилирования.