final. Uma corotina pode ser suspensa e esperar o processamento de uma outra corotina. No caso, asyncio.sleep(2) e uma corotina do modulo asyncio que suspende a execucao da funcao pelo numero de segundos passados como parametro. Na realidade, esta chamada retorna uma corotina que e marcada como completa apos os 2 segundos. Isto pode ser realizado pois no yield from, criamos a nova corotina e indicamos ao loop que nao continue a executar print_and_repeat ate que a nova corotina esteja concluida. A partir deste ponto, a execucao volta ao loop de eventos que monitora a conclusao da nova corotina criada, suspendendo a execucao da anterior. Uma vez que o a corotina do sleep e concluida, apos 2 segundos, o loop reativa a chamada suspensa de print_and_repeat e a execucao continua, voltando para o while. Parece complicado, mas veja como ficou facil de escrevermos a funcao. Fica bem mais claro nossa intencao de realizar uma repeticao do print('Hello World') a cada 2 segundos.Modificamos tambem a chamada de execucao da corotina, pois agora utilizamos loop.run_until_complete para iniciar nossa corotina principal. Aproveitamos para colocar tudo entre um try...finally para terminar a execucao do loop corretamente (mesmo em caso de excecao). Perceba que no exemplo anterior, com call_soon, passamos a funcao e seus parametros, mas nao executamos a funcao em si. No caso de run_until_complete, estamos passando o retorno da chamada de print_and_repeat que e uma corotina, uma vez que a marcamos com o decorador @asyncio.coroutine.No post anterior comparamos a velocidade de execucao entre as varias formas de se executar codigo em paralelo com Python. Agora veremos como usar o asyncio para criar uma aplicacao pratica, como um cliente e um servidor TCP/IP, mas indo alem dos exemplos da documentacao do Python. E preciso lembrar que o modulo asyncio ainda e muito novo e que tanto a documentacao quanto a implementacao de algumas funcionalidades ainda estao sendo alteradas.Vamos comecar pelo servidor. Um servidor TCP/IP e um exemplo classico de programa chato a escrever. Normalmente, voce pode escolher utilizar threads ou se aventurar com select e chamadas nao bloqueantes para gerenciar varias conexoes. Este problema se agrava em aplicacoes mais complexas, onde algum processamento precisa ser realizado antes de se gerar a resposta, por exemplo, a um comando do usuario. Usando o modulo asyncio, esta tarefa fica bem mais facil. Primeiro, porque o tratamento de dados e gerenciado por uma classe, responsavel pelo protocolo. Esta classe traz metodos que sao chamados em situacoes comuns ao programarmos um servidor TCP/IP, como chegada de uma nova conexao, desconexao, chegada de dados para leitura entre outras. Alem disso, o asyncio tambem traz classes especializadas em quebrar os dados em linhas, o que facilita a implementacao de protocolos com comandos em formato texto, terminados por enter (CR).O servidor e controlado por uma classe chamada EchoServer, pois o desenvolvi a partir do servidor de Echo dado como exemplo na documentacao, mas com alguns detalhes que observei no codigo do modulo asyncio. O protocolo implementado e bem simples, a cada linha, a data e hora atuais sao enviadas. Se o cliente enviar sair