Sto cercando di familiarizzare con asyncio, quindi ho deciso di scrivere un client di database. Tuttavia, le prestazioni corrispondono esattamente al codice sincrono. Sono sicuro che questo è il mio fraintendimento di un concetto. Qualcuno potrebbe spiegare cosa sto facendo wriong?Prestazioni di asyncio
Si prega di vedere l'esempio di codice qui sotto:
class Connection:
def __init__(self, reader, writer, loop):
self.futures = deque()
# ...
self.reader_task = asyncio.async(self.recv_data(), loop=self.loop)
@asyncio.coroutine
def recv_data(self):
while 1:
try:
response = yield from self.reader.readexactly(4)
size, = struct.unpack('I', response)
response = yield from self.reader.readexactly(size)
# ...
future = self.futures.popleft()
if not future.cancelled():
future.set_result(response)
except Exception:
break
def send_data(self, data):
future = asyncio.Future(loop=self.loop)
self.futures.append(future)
self.writer.write(data)
return future
loop = asyncio.get_event_loop()
@asyncio.coroutine
def benchmark():
connection = yield from create_connection(loop=loop, ...)
for i in range(10000):
yield from connection.send_data(...)
s = time.monotonic()
loop.run_until_complete(benchmark())
e = time.monotonic()
print('Requests per second:', int(10000/(e - s)))
Grazie in anticipo.
Perfetto, grazie. Da quello che potrei capire è come creare un'attività per ogni chiamata "send_data"? – Andrew
@Andrew Più o meno, anche se avresti ancora bisogno di aggiungere il codice al benchmark per attendere il completamento di ogni 'Task'. In realtà, credo che la chiamata a 'asyncio.wait' trasformerà tutti gli oggetti di coroutine passati ad esso in istanze di' Task' internamente, comunque. – dano
Sì, siete entrambi corretti. 'asyncio.wait' avvolgerà qualsiasi oggetto passato in coroutine o attendibile in un futuro' Task'. L'atto solitario di avvolgerli con 'loop.create_task' o' asyncio.ensure_future' può programmarli nel ciclo, ma non blocca l'esecuzione del codice di coroutine mentre alla fine finisce.Dovresti comunque "cedere" a quelle "Task" o passarle a qualcosa come "asyncio.wait". –