Der folgende Code instanziiert ein asyncio.Queue
-Objekt und versucht, diese Warteschlange aus zwei verschiedenen Korotinen bzw. arrival()
und server()
aufzufüllen und zu konsumieren.Python asyncio queue nicht aktualisiert
loop = asyncio.get_event_loop()
q = asyncio.Queue()
async def arrival(q):
print('ARRIVAL - Queue id:', id(q))
while True:
await asyncio.sleep(1)
item = random.choice(['item1', 'item2'..., 'item100'])
q.put(item)
print('ARRIVAL - added {}, qsize is now {}'.format(item, q.qsize()))
async def server(q):
print('SERVER - Queue id:', id(q))
while True:
item = await q.get()
print('SERVER - taking {}, qsize is now {}'.format(item, q.qsize()))
await asyncio.sleep(1.8)
print('SERVER - finished processing {}'.format(item))
tasks = [loop.create_task(arrival(q)), loop.create_task(server(q))]
loop.run_until_complete(asyncio.gather(*tasks))
Das Prinzip ist das folgende:
- alle 1 Sekunde, ein Element
q
- jederzeit hinzugefügt wird, der Server frei ist, nimmt es den nächsten Eintrag in der Warteschlange oder wartet auf ihn
- Der Server nimmt 1,8 Sekunden ein Element
die erwartete Ausgabe würde zu verarbeiten:
SERVER - Queue id: 12345678
ARRIVAL - Queue id: 12345678
ARRIVAL - added item1, qsize is now 1
SERVER - taking item1, qsize is now 0
ARRIVAL - added item2, qsize is now 1
SERVER - finished processing item1
SERVER - taking item2, qsize is now 0
ARRIVAL - added item3, qsize is now 1
ARRIVAL - added item4, qsize is now 2
SERVER - finished processing item2
SERVER - taking item3, qsize is now 1
ARRIVAL - added item5, qsize is now 2
ARRIVAL - added item6, qsize is now 3
SERVER - finished processing item3
SERVER - taking item4, qsize is now 2
Jedoch, wenn ich den obigen Code ausführen, werden die Elemente in while True
Schleife in server()
nie ausgeführt, ist q.qsize()
immer 0, und der Ausgang ist:
SERVER - Queue id: 12345678
ARRIVAL - Queue id: 12345678
ARRIVAL - added item1, qsize is now 0
ARRIVAL - added item2, qsize is now 0
ARRIVAL - added item3, qsize is now 0
ARRIVAL - added item4, qsize is now 0
ARRIVAL - added item5, qsize is now 0
...
Es scheint, dass die q
Objekt nie aktualisiert von arrival()
(q.qsize()
ist immer 0) und daher server()
ist nie bewusst, die Elemente von arrival()
hinzugefügt.
Dank! Das bedeutungsvolle Bit rief 'await q.put (item)' anstatt nur 'q.put (item)'. Macht Sinn, da 'q.put' eine Coroutine ist, aber irgendwie habe ich es verpasst. – Jivan
@Jivan Ja, wollte hinzufügen, dass dies eines der wichtigeren Dinge war, die ich geändert habe ... Entschuldigung. & Frohes neues Jahr! –
Andererseits scheint das Ersetzen von 'asyncio.gather()' durch 'asyncio.wait()' in diesem Fall keine Wirkung zu haben. Ich sollte den Unterschied in den Dokumenten untersuchen. Frohes neues Jahr! – Jivan