[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