2016-04-15 2 views
1

Я выполняю длинную задачу с интенсивным использованием ЦП на веб-сервере (торнадо). Я не хочу разгружать эту задачу в поток (пока). Как правильно «вывести» управление во время этой долговременной задачи в 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) 

ответ

1

Он не упоминается в доке, но в настоящее время asyncio.sleep(0) является распространенным способом сделать это. Вы можете прочитать полное обсуждение here. Кроме того, asyncio.sleep(0) был специально optimized, чтобы сделать работу. Поскольку этот случай has test, я думаю, вы можете не бояться поведения.

+0

Отлично! Связанный с точной дискуссией, которую я искал. Пока BDFL говорит, что это способ сделать это, я доволен этим :). – Claude

Смежные вопросы