[Python] Client TCP con asyncio

Christian Barra barrachri a gmail.com
Gio 9 Nov 2017 09:41:17 CET



> On 9 Nov 2017, at 07:40, Vinny Mautone <vinny74man a gmail.com> wrote:
> 
> Questo è _run_once()
> 
> Help on method _run_once in module asyncio.base_events:
> 
> _run_once() method of asyncio.windows_events._WindowsSelectorEventLoop instance
>     Run one full iteration of the event loop.
>     
>     This calls all currently ready callbacks, polls for I/O,
>     schedules the resulting callbacks, and finally schedules
>     'call_later' callbacks.
> 
> Girando su i vari forum che parlano dell'argomento  ho letto che era una soluzione l'ho provata e funziona.



L’underscore all’inizio di _run_once, mi fa pensare che non sia qualcosa da utilizzare…

Hai per caso un link alla documentazione?


> 
> Per il client ho usato una classe che eredita da asyncio.protocol, all'interno della quale c'è una funzione predefinita
> connection_lost(), ed è li che fermo il loop con loop.stop()

Perche fermi il loop dall’interno di un future?

https://docs.python.org/3/library/asyncio-protocol.html#asyncio.BaseProtocol.connection_lost <https://docs.python.org/3/library/asyncio-protocol.html#asyncio.BaseProtocol.connection_lost>

Non hai più’ senso definire un async def tcp_reconnect da utilizzare come callback?


> 
> questo è il main dello script
> 
> if __name__ == '__main__':
>     while True:
>         try:
>             host ='localhost'
>             port = 8442
>             username = 'python_tcp_client\n'
>             loop = asyncio.get_event_loop()
>             loop.run_until_complete(tcp_reconnect(username, loop, host, port))
>         except KeyboardInterrupt:
>             break
>         except Exception as e:
>             print(e)
>         finally:
>             for task in asyncio.Task._all_tasks:
>                 task.cancel()
>             loop._run_once()
>     loop.close()
> 
> Senza questa riga " except Exception as e: " il programma non si riavviava ma si fermava per l'eccezione
> ""Event loop stopped before Future completed."
> in questo modo tramite la print() la evidenzio ma tutto prosegue.

Probabilmente il while True va all’interno di tcp_connect o reconnect.
asyncio.ensure_future(tcp_reconnect(username, loop, host, port))
loop.run_until_complete diventa run_forever.
Except per il Keyboard diventa un pass o qualcos’altro.

loop._run_once() lo toglierei, come dicevo prima probabilmente stai accedendo a delle private api di asyncio.

Per i Tasks, devi capire se li vuoi consumare (con gather per esempio) o semplicemente cancellare.

Alla fine loop.close()


——
Christian Barra
Python Freelancer // Consultant // Trainer
Board member of the EuroPython Society
www.chrisbarra.xyz
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20171109/c0742333/attachment.html>


Maggiori informazioni sulla lista Python