2016-05-18 12 views
1

Ich versuche faire Warteschlangen in meiner Bibliothek zu implementieren, die auf asyncio basiert.Ist asyncio.wait Auftrag garantiert?

In einigen Funktion habe ich eine Aussage wie (unter der Annahme socketX sind Aufgaben):

done, pending = asyncio.wait(
    [socket1, socket2, socket3], 
    return_when=asyncio.FIRST_COMPLETED, 
) 

Nun lese ich in der Dokumentation zu asyncio.wait viele Male, aber es enthält nicht die Informationen, die ich bin nach. Vor allem würde ich gerne wissen, ob:

  • socket1, socket2 und socket3 geschahen schon bereit sein, wenn ich den Anruf erteilen. Ist es garantiert, dass done sie alle enthält oder könnte es sein, dass es nur einen (oder zwei) zurückgibt?
  • Ist im zweiten Fall die Reihenfolge der Tasks, die an wait() übergeben wurden, von Bedeutung?

Ich versuche, zu behaupten, wenn ich nur fair-Warteschlangen in dem Satz von done Aufgaben anwenden kann (durch eine und verlassen die anderen Aufgaben für die spätere Auflösung Kommissionierung) oder wenn ich auch über den Auftrag zu kümmern brauche ich übergeben Sie die Aufgaben in.

Die Dokumentation ist etwas still darüber. Irgendeine Idee ?

Antwort

4

Dies ist nur nach der source code von Python 3.5 genommen.

Wenn die Zukunft vor dem Aufruf wait getan wird, werden sie alle in dem done Satz platziert werden:

import asyncio 

async def f(n): 
    return n 

async def main(): 
    (done, pending) = await asyncio.wait([f(1), f(2), f(3)], return_when=asyncio.FIRST_COMPLETED) 
    print(done)  # prints set of 3 futures 
    print(pending) # prints empty set 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main()) 
loop.close() 
+0

Ich habe versucht, dass auch, aber es mir nicht Quellcode Python auftreten zu überprüfen. Nicht genug Schlaf, denke ich. Vielen Dank, dass du es an deiner Seite ausprobiert hast. Ich denke, wir können daraus schließen, dass es keine Garantie dafür gibt, dass es sich immer so verhält, sondern dass die aktuelle Implementierung dies auf allen Plattformen tut. – ereOn