programing

Promise와 같은 대기물을 결합합니다.모든.

starjava 2023. 6. 6. 00:24
반응형

Promise와 같은 대기물을 결합합니다.모든.

비동기 JavaScript에서는 작업을 병렬로 실행하고 모든 작업이 완료될 때까지 기다리는 것이 쉽습니다.Promise.all:

async function bar(i) {
  console.log('started', i);
  await delay(1000);
  console.log('finished', i);
}

async function foo() {
    await Promise.all([bar(1), bar(2)]);
}

// This works too:
async function my_all(promises) {
    for (let p of promises) await p;
}

async function foo() {
    await my_all([bar(1), bar(2), bar(3)]);
}

저는 후자를 파이썬으로 다시 쓰려고 했습니다.

import asyncio

async def bar(i):
  print('started', i)
  await asyncio.sleep(1)
  print('finished', i)

async def aio_all(seq):
  for f in seq:
    await f

async def main():
  await aio_all([bar(i) for i in range(10)])

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

하지만 그것은 제 업무를 순차적으로 수행합니다.

여러 대기자를 기다리는 가장 간단한 방법은 무엇입니까?내 접근 방식이 작동하지 않는 이유는 무엇입니까?

이에 상응하는 것은 다음과 같습니다.

import asyncio

async def bar(i):
  print('started', i)
  await asyncio.sleep(1)
  print('finished', i)

async def main():
  await asyncio.gather(*[bar(i) for i in range(10)])

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

내 접근 방식이 작동하지 않는 이유는 무엇입니까?

왜냐하면 당신이await의 각 항목seq그 코루틴을 차단하세요.그래서 본질적으로 비동기식으로 가장하는 동기식 코드가 있습니다.만약 당신이 정말 원한다면, 당신은 당신 자신의 버전을 구현할 수 있습니다.asyncio.gather사용.loop.create_task또는asyncio.ensure_future.

편집

원래 답변은 하위 수준을 사용했습니다.

asyncio.gather()가 asyncio 외에 기다리는 더 나은 방법일 수 있다는 것을 알게 되었습니다.주문한 결과를 원하시면 ()기다려주세요.

문서에서 알 수 있듯이 asyncio.gather() 메서드의 결과 값 순서는 awaitable 순서에 해당합니다.그러나 비동기식의 결과 값 순서입니다.wait()은 같은 일을 하지 않을 것입니다.테스트할 수 있습니다.

https://docs.python.org/3/library/asyncio-task.html#asyncio.gather

asyncio.gather()각 비동기 함수 호출의 출력 목록을 반환합니다.

import asyncio

async def bar(i):
    print('started', i)
    await asyncio.sleep(1)
    print('finished', i)
    return i

async def main():
    values = await asyncio.gather(*[bar(i) for i in range(10)])
    print(values)

asyncio.run(main())

이 방법은 목록 대신 동시 작업에 대해 임의의 수의 인수를 사용하므로 압축을 풉니다.

이 중간값을 필요로 하는 것은 매우 일반적입니다.values부작용이 생기도록 기능/기능을 설계하는 대신에, my eg.

파이썬 3.11 이후:

작업을 만들고 동시에 실행하고 완료를 기다리는 보다 현대적인 방법은 비동기식입니다.작업 그룹.

하지만, 저는 수집보다 작업 그룹을 선호해야 하는 이유를 찾을 수 없었습니다.

언급URL : https://stackoverflow.com/questions/34377319/combine-awaitables-like-promise-all

반응형