У меня есть веб-приложение «Торнадо», которое в основном является асинхронным, но имеет большие участки работы, привязанные к процессору, где оно выполняет итерацию по данным. В большинстве случаев имеется всего несколько сотен строк, но иногда их может быть несколько десятков тысяч, что блокирует цикл событий на несколько секунд. Мне интересно, какой метод преобразования этих функций синхронизации в асинхронный является предпочтительным. Мои два варианта выглядят так:
Код: Выделить всё
# Iterate over rows from db
i = 0
for row in rows:
i += 1
if i % 10000 == 0:
await asyncio.sleep(0)
# Do some processing
или
Код: Выделить всё
# func being the above code that iterates over rows without sleep
executor = concurrent.futures.ThreadPoolExecutor(max_workers=10)
await asyncio.get_event_loop().run_in_executor(executor, func)
Я знаю, что чтобы избежать ограничений GIL, мне следует использовать ProcessPoolExecutor, но в большинстве случаев количество строк, которые он должен обработать, довольно мало, поэтому использование ProcessPoolExecutor может не оправдать накладных расходов.< /п>
Подробнее здесь:
https://stackoverflow.com/questions/790 ... -functions