2015-08-09 3 views
11

Может ли кто-нибудь предоставить практические советы о том, как выбрать между задачами и coroutines модуля asyncio python?Когда следует использовать задачу вместо сопрограммы?

Если бы я достичь что-то асинхронно, я мог бы сделать что-либо из ниже 2 -

import asyncio 

@asyncio.coroutine 
def print_hello(): 
    print('Hello') 

loop = asycio.get_event_loop() 
loop.run_until_complete(print_hello) 
loop.close() 

ИЛИ

import asyncio 

@asyncio.coroutine 
def print_hello(): 
    print('Hello') 

print_task = asyncio.ensure_future(print_hello) 

loop = asycio.get_event_loop() 
loop.run_until_complete(asyncio.wait_for(print_task)) 
loop.close() 

Какие факторы решить, какой из 2-х выше способов выбрать?

+3

Как правило, вы бы использовать сопрограмму, когда вы хотите, чтобы непосредственно пару его в вызывающем родительских сопрограммы, используя выход из. Эта связь - это то, что заставляет ребенка coroutine и вынуждает родительскую сопрограмму ждать, пока дочерняя сопрограмма вернется до продолжения. Задача, с другой стороны, не должна управляться родительской сопрограммой, поскольку она может управлять собой. – shongololo

+0

Есть ли [этот вопрос] (http://stackoverflow.com/q/27076577/2073595) ответ на ваш вопрос удовлетворительным образом? Я соблазн отметить это как обман, но дайте мне знать, если вы ищете дополнительную информацию. – dano

+1

Кроме того, 'loop.run_until_complete (coro)' всегда преобразует 'coro' в' Task' внутри; вам нужна хотя бы одна «задача» для управления программой. – dano

ответ

1

«Как правило, вы должны использовать сопрограмму, когда вы хотите напрямую связать ее с вызывающей родительской сопрограммой, используя выход из нее. Эта связь - это то, что управляет дочерней сопрограммой и заставляет родительскую сопрограмму ждать, пока дочерняя сопрограмма вернется до Однако задача, с другой стороны, не должна управляться родительской сопрограммой, поскольку она может управлять собой ». - shongololo

(Пожалуйста, не отвечайте вещи в комментариях)

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