Профилирование приложения, которое использует реакторы / веб-сокеты и потоки

Привет, я написал программу на 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() с описанием события и вызовом функции профилирования.

Другие вопросы по тегам