Производительность Asyncio с синхронным кодом - PullRequest
0 голосов
/ 21 февраля 2019

Я создаю следующий тест для проверки производительности при выполнении синхронного кода в асинхронной функции.

В return_random функция может быть чем-то вроде записи журнала, дампа или загрузки json, проверки даты ввода-вывода, которая вызываетдругие функции ... и т. д.

Переменные count_sync и count_async, используемые для пропуска служебных данных при открытии и закрытии цикла событий.просто вычислите время внутри функции.

Эта часть кода просто вызывает синхронный подсчет раз.

import timeit
from time import time
from random import random

count = 100
run_numbers = 100000

count_sync = 0

def return_random():
    return random()

def test():
    global count_sync
    start = time()
    for _ in range(count):
       return_random()
    count_sync += time() - start
    return

total_sunc = timeit.timeit('test()', globals=globals(), 
      number=run_numbers))

Тот же код, но теперь return_random является асинхронной функцией:

import asyncio
import uvloop

asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

count_async = 0

async def return_random_async():
   return random()

async def test_async():
   global count_async
   start = time()
   for _ in range(count):
      await return_random_async()
   count_async += time() - start
   return

total_sunc = timeit.timeit('asyncio.run(test_async())', globals=globals(), number=run_numbers)

После выполнения кода с разными номерами функции вызова и счетчиком времени его выполнения получаются следующие результаты:

RUNNING run_numbers: 1000. CALL FUNCTIONS count: 1000
total sync:  0.12023316
total Async: 0.48369559500000003
inside def sync  0.11995530128479004
inside def Async:0.24073457717895508

RUNNING run_numbers: 100000. CALL FUNCTIONS count: 100
total sync:   1.422697458
total Async: 25.452165134999998   (!!!)
inside def sync:  1.3965537548065186
inside def Async: 2.8397130966186523

Все время выполняется с синхронной функцией быстрее, чем в 2 раза.

Значит ли это, что синхронный код лучше работает с не асинхронной функцией?И желательно не использовать много асинхронных функций?

1 Ответ

0 голосов
/ 21 февраля 2019

Вам необходимо использовать асинхронные функции только тогда, когда вам это действительно нужно.Примеры: асинхронные библиотеки http, такие как aiohttp, асинхронные драйверы, такие как motor_asyncio для MongoDB, и т. Д. В других случаях лучше запускать синхронный код с неасинхронными функциями, поскольку они требуют дополнительных затрат, которые вам не нужны.

...