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.
작업을 만들고 동시에 실행하고 완료를 기다리는 보다 현대적인 방법은 비동기식입니다.작업 그룹.
하지만, 저는 수집보다 작업 그룹을 선호해야 하는 이유를 찾을 수 없었습니다.
언급URL : https://stackoverflow.com/questions/34377319/combine-awaitables-like-promise-all
'programing' 카테고리의 다른 글
구성 API vue3에서 디스패처 호출 (0) | 2023.06.11 |
---|---|
마리아에서 모든 외부 키를 선택하는 방법DB (0) | 2023.06.06 |
열 번호에서 Excel 스타일 열 이름 가져오기 (0) | 2023.06.06 |
레일즈의 현재 경로는 어떻게 알 수 있습니까? (0) | 2023.06.06 |
목록에서 단어 빈도를 세고 빈도별로 정렬 (0) | 2023.06.06 |