[python] Asyncio.Gather vs asyncio.wait

asyncio.gatherasyncio.wait이와 유사한 용도를 갖고있는 것 같다 : 나는 (반드시 다음 일이 시작되기 전에 완료 한 대기하지 않음)에 대한 / 대기를 실행하려는 것을 내가 비동기 가지의 무리가 있습니다. 그것들은 다른 구문을 사용하고 세부 사항이 다르지만 기능적으로 큰 겹치는 두 가지 기능을 갖는 것은 비현실적입니다. 내가 무엇을 놓치고 있습니까?



답변

일반적인 경우와 비슷하지만 ( “많은 작업에 대한 결과를 가져오고”) 각 기능에는 다른 경우에 대한 특정 기능이 있습니다.

asyncio.gather()

높은 수준의 작업 그룹화를 허용하는 Future 인스턴스를 반환합니다.

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)

group2.cancel()또는 을 호출하여 그룹의 모든 작업을 취소 할 수 있습니다 all_groups.cancel(). 참조 .gather(..., return_exceptions=True),

asyncio.wait()

첫 번째 작업이 완료된 후 또는 지정된 시간 초과 후 중지 대기를 지원하여 작업의 정밀도를 낮 춥니 다.

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보다 낮은 수준 asyncio.gather입니다.

이름에서 알 수 있듯이 asyncio.gather주로 결과 수집에 중점을 둡니다. 그것은 많은 선물을 기다리고 주어진 순서대로 결과를 반환합니다.

asyncio.wait단지 선물을 기다립니다. 결과를 직접 제공하는 대신 완료 및 보류중인 작업을 제공합니다. 수동으로 값을 수집해야합니다.

또한 모든 미래가 끝날 때까지 기다리거나 첫 번째로 끝나는 것을 지정할 수 wait있습니다.


답변

또한 단순히 목록을 지정하여 wait ()에서 코 루틴 그룹을 제공 할 수 있음을 알았습니다.

result=loop.run_until_complete(asyncio.wait([
        say('first hello', 2),
        say('second hello', 1),
        say('third hello', 4)
    ]))

gather ()의 그룹화는 여러 코 루틴을 지정하여 수행됩니다.

result=loop.run_until_complete(asyncio.gather(
        say('first hello', 2),
        say('second hello', 1),
        say('third hello', 4)
    ))


답변