Come esempio semplice, considerare l'equivalente di rete di/dev/zero, di seguito. (. O più realisticamente, solo un web server l'invio di un file di grandi dimensioni)Come rilevare errori di scrittura in asyncio?
Se un cliente si disconnette presto, si ottiene una raffica di messaggi di log:
WARNING:asyncio:socket.send() raised exception.
Ma io non sto trovando alcun modo per la cattura ha detto eccezione. L'ipotetico server continua a leggere i gigabyte dal disco e li invia a un socket morto, senza alcuno sforzo da parte del client, e ti sei procurato un attacco DoS.
L'unica cosa che ho trovato dai documenti è di cedere da una lettura, con una stringa vuota che indica la chiusura. Ma non va bene qui perché un normale client non invierà nulla, bloccando il ciclo di scrittura.
Qual è il modo corretto per rilevare le scritture non riuscite o essere avvisati che la connessione TCP è stata chiusa, con l'API dello streaming o altro?
Codice: API basata
from asyncio import *
import logging
@coroutine
def client_handler(reader, writer):
while True:
writer.write(bytes(1))
yield from writer.drain()
logging.basicConfig(level=logging.INFO)
loop = get_event_loop()
coro = start_server(client_handler, '', 12345)
server = loop.run_until_complete(coro)
loop.run_forever()
** Aggiornamento: ** Questo è ora [corretto] (https://github.com/python/asyncio/pull/280) a monte nella libreria 'asyncio'. –