Como criar e executar corretamente tarefas simultâneas usando o módulo assíncio do python?

Estou tentando entender e implementar corretamente dois programas em execução simultaneamente.Task objetos usando o relativamente novo do Python 3asyncio módulo.

Em poucas palavras, assíncrono parece projetado para lidar com processos assíncronos e simultâneosTask execução sobre um loop de eventos. Promove o uso deawait (aplicado em funções assíncronas) como uma maneira sem retorno de chamada para aguardar e usar um resultado, sem bloquear o loop de eventos. (Futuros e retornos de chamada ainda são uma alternativa viável.)

Também fornece oasyncio.Task() classe, uma subclasse especializada deFuture Concebido para embrulhar corotinas. Preferencialmente chamado usando oasyncio.ensure_future() método. O uso pretendido das tarefas assíncronas é permitir que tarefas em execução independentes sejam executadas 'simultaneamente' com outras tarefas no mesmo loop de eventos. Meu entendimento é queTasks são conectados ao loop de eventos, que automaticamente mantém a corotina entreawait afirmações.

Eu gosto da ideia de poder usar tarefas simultâneas sem precisar usar um dosExecutor classes, mas não encontrei muita elaboração sobre implementação.

É assim que estou fazendo atualmente:

import asyncio

print('running async test')

async def say_boo():
    i = 0
    while True:
        await asyncio.sleep(0)
        print('...boo {0}'.format(i))
        i += 1

async def say_baa():
    i = 0
    while True:
        await asyncio.sleep(0)
        print('...baa {0}'.format(i))
        i += 1

# wrap in Task object
# -> automatically attaches to event loop and executes
boo = asyncio.ensure_future(say_boo())
baa = asyncio.ensure_future(say_baa())

loop = asyncio.get_event_loop()
loop.run_forever()

No caso de tentar executar simultaneamente duas tarefas em loop, notei que, a menos que a tarefa tenha umawait expressão, ele ficará preso nowhile , efetivamente impedindo a execução de outras tarefas (como um normalwhile ciclo). No entanto, assim que as Tarefas precisam (a) aguardar, elas parecem ser executadas simultaneamente sem problemas.

Então, oawait As instruções parecem fornecer um ponto de apoio ao loop de eventos para alternar entre as tarefas, dando o efeito de simultaneidade.

Exemplo de saída com internoawait:

running async test
...boo 0
...baa 0
...boo 1
...baa 1
...boo 2
...baa 2

Saída de exemplosem internoawait:

...boo 0
...boo 1
...boo 2
...boo 3
...boo 4
Questões

Essa implementação passa por um exemplo 'adequado' de tarefas simultâneas em loop noasyncio?

É correto que a única maneira de isso funcionar seja por umTask para fornecer um ponto de bloqueio (await expressão) para que o loop de eventos manipule várias tarefas?

questionAnswers(2)

yourAnswerToTheQuestion