2016-03-29 3 views
1

Ich spiele mit asyncio UDP server example und möchte eine sleep aus der datagram_received Methode haben.asyncio.sleep von innerhalb eines UDP-Servers funktioniert nicht

import asyncio 

class EchoServerProtocol: 
    def connection_made(self, transport): 
     self.transport = transport 

    def datagram_received(self, data, addr): 
     message = data.decode() 
     print('Received %r from %s' % (message, addr)) 
     # Sleep 
     await asyncio.sleep(1) 
     print('Send %r to %s' % (message, addr)) 
     self.transport.sendto(data, addr) 

loop = asyncio.get_event_loop() 
print("Starting UDP server") 
# One protocol instance will be created to serve all client requests 
listen = loop.create_datagram_endpoint(EchoServerProtocol, 
             local_addr=('127.0.0.1', 9999)) 
transport, protocol = loop.run_until_complete(listen) 

try: 
    loop.run_forever() 
except KeyboardInterrupt: 
    pass 

transport.close() 
loop.close() 

Dieser schlägt mit einem SyntaxError auf Schlaf Linie (Python 3.5.1). Die Verwendung von time.sleep funktioniert offensichtlich nicht, da es verhindert, dass ein anderes Datagramm empfangen wird. Irgendwelche Hinweise, wie man das löst?

Ziel ist es, diese sleep durch einen echten nicht blockierenden E/A-Aufruf zu ersetzen.

Antwort

0

Es scheint, dass die await in einer async def (Coroutine) leben muss. Um dies zu tun, müssen Sie einen Anruf über asyncio.ensure_future auslösen.

def datagram_received(self, data, addr): 
    asyncio.ensure_future(self.reply(data, addr)) 

async def reply(self, data, addr): 
    await asyncio.sleep(1) 
    self.transport.sendto(data, addr) 
+0

Beachten Sie, dass 'ensure_future' nur die Ausführung plant. Sie haben keine Garantie wann/wie (mit Fehler) wird es abgeschlossen, wenn überhaupt. – kwarunek

Verwandte Themen