asyncio.gather
i asyncio.wait
wydają się mieć podobne zastosowania: Mam kilka asynchronicznych rzeczy, które chcę wykonać/czekać (niekoniecznie czekając na zakończenie, zanim zacznie się następny). Używają innej składni i różnią się pewnymi szczegółami, ale wydaje mi się bardzo nieprecyzyjna, że mam 2 funkcje, które mają tak wielkie nakładanie się funkcji. czego mi brakuje?Asyncio.gather vs asyncio.wait
Odpowiedz
Chociaż podobne w ogólnych przypadkach („biegać i uzyskać wyniki do wielu zadań”), każda funkcja ma pewną specyficzną funkcjonalność dla pozostałych przypadkach:
asyncio.gather()
Zwraca Future instancji, umożliwiając wysoką grupowanie poziomowego zadania:
import asyncio
from pprint import pprint
import random
async def coro(tag):
print(">", tag)
await asyncio.sleep(random.uniform(1, 3))
print("<", tag)
return tag
loop = asyncio.get_event_loop()
group1 = asyncio.gather(*[coro("group 1.{}".format(i)) for i in range(1, 6)])
group2 = asyncio.gather(*[coro("group 2.{}".format(i)) for i in range(1, 4)])
group3 = asyncio.gather(*[coro("group 3.{}".format(i)) for i in range(1, 10)])
all_groups = asyncio.gather(group1, group2, group3)
results = loop.run_until_complete(all_groups)
loop.close()
pprint(results)
wszystkich zadań w grupie może być anulowana przez wywołanie group2.cancel()
lub nawet all_groups.cancel()
. Zobacz także .gather(..., return_exceptions=True)
,
asyncio.wait()
Obsługuje czeka być zatrzymany po pierwszym zadaniem jest zrobione, albo po upływie określonego limitu czasu, dzięki czemu dokładność niższy poziom operacji:
import asyncio
import random
async def coro(tag):
print(">", tag)
await asyncio.sleep(random.uniform(0.5, 5))
print("<", tag)
return tag
loop = asyncio.get_event_loop()
tasks = [coro(i) for i in range(1, 11)]
print("Get first result:")
finished, unfinished = loop.run_until_complete(
asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED))
for task in finished:
print(task.result())
print("unfinished:", len(unfinished))
print("Get more results in 2 seconds:")
finished2, unfinished2 = loop.run_until_complete(
asyncio.wait(unfinished, timeout=2))
for task in finished2:
print(task.result())
print("unfinished2:", len(unfinished2))
print("Get all other results:")
finished3, unfinished3 = loop.run_until_complete(asyncio.wait(unfinished2))
for task in finished3:
print(task.result())
loop.close()
asyncio.wait
jest bardziej niski poziom niż asyncio.gather
.
Zgodnie z nazwą, asyncio.gather
skupia się głównie na zbieraniu wyników. czeka na wiele przyszłości i zwraca wyniki w określonej kolejności.
asyncio.wait
tylko czeka na futures. i zamiast dawać wyniki bezpośrednio, daje on gotowe i oczekujące zadania. musisz ręcznie zbierać wartości.
Co więcej, można określić oczekiwanie na zakończenie wszystkich kontraktów terminowych lub właśnie ten pierwszy z wait
.
Zauważyłem również, że można podać grupę współprogram w wait() po prostu określając listę:
result=loop.run_until_complete(asyncio.wait([
say('first hello', 2),
say('second hello', 1),
say('third hello', 4)
]))
co następuje grupowanie się zebrać() odbywa się tylko z podaniem wielu współprogram:
result=loop.run_until_complete(asyncio.gather(
say('first hello', 2),
say('second hello', 1),
say('third hello', 4)
))
- 1. metoda vs funkcja vs procedura vs klasa?
- 2. body.scrollTop vs documentElement.scrollTop vs window.pagYOffset vs window.scrollY
- 3. Opa vs Dart vs Haxe vs coffeescript
- 4. VS 2008 vs VS 2008 Express
- 5. Strona vs Extent vs. Segment vs. Tabele
- 6. Crystalspace vs. Irrlicht vs. .....?
- 7. NetSqlAzMan vs AzMan vs (?????)
- 8. SpiderMonkey vs JavaScriptCore vs?
- 9. Klasa vs pakiet vs moduł vs komponent vs kontener kontra serwis vs platforma w świecie Java
- 10. Zmierz czas w Linuksie - czas vs zegar vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?
- 11. IDataErrorInfo vs ValidationRule vs Exception
- 12. Boo vs C# vs Python?
- 13. DbConnection vs OleDbConnection vs OdbcConnection
- 14. Matlab vs Aforge vs OpenCV
- 15. DDS vs AMQP vs ZeroMQ
- 16. ScheduledExecutorService vs Timer vs Handler
- 17. flume vs kafka vs inni
- 18. ActiveMQ vs Apollo vs Kafka
- 19. getBBox() vs getBoundingClientRect() vs getClientRects()
- 20. Object vs Class vs Function
- 21. Wskaźniki vs auto_ptr vs shared_ptr
- 22. fadeIn fadeOut vs vs fadeTo
- 23. DMD vs. GDC vs. LDC
- 24. select vs poll vs epoll
- 25. Xamarin vs. Mono vs. Monodevelop
- 26. rmi vs servlets vs gniazda
- 27. filter_var vs htmlentities vs htmlspecialchars
- 28. managedQuery() vs context.getContentResolver.query() vs android.provider.something.query()
- 29. getchar_unlocked() VS scanf() VS cin
- 30. HttpRequest vs HttpRequestMessage vs HttpRequestBase
"Pojedyncza forma gwiazdki (* args) służy do przekazania listy argumentów o zmiennej długości, która nie jest słowami kluczowymi, a formularz podwójnej gwiazdki służy do przekazywania listy argumentów o zmiennej długości słów kluczowych" – laycat