Я выполняю длинную задачу с интенсивным использованием ЦП на веб-сервере (торнадо). Я не хочу разгружать эту задачу в поток (пока). Как правильно «вывести» управление во время этой долговременной задачи в eventloop, чтобы веб-запросы все еще обслуживались (обратите внимание: я использую «yield» в смысле планирования сотрудничества здесь, а не в смысле генератора , или ключевое слово python yield
).Кооперативная доходность в asyncio
Мое предложение было бы сделать await asyncio.sleep(0)
, однако есть ли гарантия, что это не просто реализовано как NOP? Я искал специальную функцию в библиотеке asyncio для этого, но до сих пор не смог ее найти.
Пример (питон 3,5 асинхронные/ждут стиля):
async def long_task():
for i in range(LARGE_NUMBER):
do_something(i)
if i % 100 == 0:
await asyncio.sleep(0)
Отлично! Связанный с точной дискуссией, которую я искал. Пока BDFL говорит, что это способ сделать это, я доволен этим :). – Claude