Chociaż w ogólnych przypadkach są podobne („uruchom i uzyskaj wyniki dla wielu zadań”), każda funkcja ma określoną funkcjonalność w innych przypadkach:
Zwraca instancję Future, umożliwiając grupowanie zadań na wysokim poziomie:
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)
Wszystkie zadania w grupie można anulować dzwoniąc group2.cancel()
lub nawet all_groups.cancel()
. Zobacz także .gather(..., return_exceptions=True)
,
Obsługuje oczekiwanie na zatrzymanie po wykonaniu pierwszego zadania lub po określonym czasie, umożliwiając niższy poziom precyzji 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 niższy niżasyncio.gather
.Jak sama nazwa wskazuje,
asyncio.gather
skupia się głównie na zbieraniu wyników. czeka na kilka kontraktów futures i zwraca ich wyniki w zadanej kolejności.asyncio.wait
po prostu czeka na przyszłość. i zamiast bezpośrednio podawać wyniki, podaje zadania wykonane i oczekujące. musisz ręcznie zbierać wartości.Co więcej, możesz określić, czy chcesz czekać, aż wszystkie futures się skończą, czy tylko pierwsza
wait
.źródło
it waits on a bunch of futures and return their results in a given order
. co jeśli mam 10000000000000 zadań i wszystkie zwracają duże dane? cały wynik spowoduje boom pamięci?Zauważyłem również, że możesz podać grupę programów w oczekiwaniu (), po prostu określając listę:
Podczas gdy grupowanie w funkcji Gather () odbywa się po prostu przez określenie wielu procedur:
źródło
gather()
np .:asyncio.gather(*task_list)