Как выполнить профилирование / тестирование кода Python ASYNCIO? - PullRequest
0 голосов
/ 21 января 2019

Как мне профилировать / тестировать асинхронный скрипт Python (который использует ASYNCIO)?

Я бы обычно делал

totalMem = tracemalloc.get_traced_memory()[0]
totalTime = time.time()

retValue = myFunction()

totalTime = time.time() - totalTime 
totalMem = tracemalloc.get_traced_memory()[0] - totalMem 

Таким образом, я бы сэкономил общее время, затраченное функцией. Я узнал, как использовать декораторы, и я так и сделал - и сбросил всю статистику в текстовый файл для последующего анализа.

Но, когда у вас есть скрипт ASYNCIO, все становится совсем по-другому: функция будет блокироваться при выполнении «await aiohttpSession.get ()», и управление вернется в цикл обработки событий, который будет запускать другие функции.

Таким образом, истекшее время и изменения в общей выделенной памяти ничего не обнаружат, потому что я измерил больше, чем просто эту функцию.

Единственный способ, которым это будет работать, будет что-то вроде

class MyTracer:
  def __init__(self):
    self.totalTime = 0
    self.totalMem = 0
    self.startTime = time.time()
    self.startMem = tracemalloc.get_traced_memory()[0]
  def stop(self):
    self.totalTime += time.time() - self.startTime
    self.totalMem += tracemalloc.get_traced_memory()[0] - self.startMem
  def start(self):
    self.startTime = time.time()
    self.startMem = tracemalloc.get_traced_memory()[0]

А теперь как-нибудь вставьте его в код:

def myFunction():

    tracer = MyTracer()

    session = aiohttp.ClientSession()

    # do something

    tracer.stop()
    # the time elapsed here, and the changes in the memory allocation, are not from the current function
    retValue = await(await session.get('https://hoochie-mama.org/cosmo-kramer',
        headers={
            'User-Agent': 'YoYo Mama! v3.0',
            'Cookies': 'those cookies are making me thirsty!',
            })).text()
    tracer.start()

    # do more things

    tracer.stop()

    # now "tracer" has the info about total time spent in this function, and the memory allocated by it
    # (the memory stats could be negative if the function releases more than allocates)

Есть ли способ выполнить это, я имею в виду, профилировать весь мой асинхронный код без необходимости вставлять весь этот код? Или есть модуль, уже способный сделать это?

...