asyncio.create_task()는 무엇을 합니까?
무엇인가.asyncio.create_task()그래요? 서류를 봤는데 이해가 안 되는 것 같아요.저를 혼란스럽게 하는 코드는 다음과 같습니다.
import asyncio
async def counter_loop(x, n):
for i in range(1, n + 1):
print(f"Counter {x}: {i}")
await asyncio.sleep(0.5)
return f"Finished {x} in {n}"
async def main():
slow_task = asyncio.create_task(counter_loop("Slow", 4))
fast_coro = counter_loop("Fast", 2)
print("Awaiting Fast")
fast_val = await fast_coro
print("Finished Fast")
print("Awaiting Slow")
slow_val = await slow_task
print("Finished Slow")
print(f"{fast_val}, {slow_val}")
asyncio.run(main())
그러면 다음과 같은 출력이 제공됩니다.
001 | Awaiting Fast
002 | Counter Fast: 1
003 | Counter Slow: 1
004 | Counter Fast: 2
005 | Counter Slow: 2
006 | Finished Fast
007 | Awaiting Slow
008 | Counter Slow: 3
009 | Counter Slow: 4
010 | Finished Slow
011 | Finished Fast in 2, Finished Slow in 4
저는 이게 어떻게 작동하는지 잘 이해가 안 돼요.
- 그래야 하지 않나요?
slow_task완료될 때까지 실행할 수 없습니다.fast_coro왜냐하면 그것은 결코 사용되지 않았기 때문입니다.asyncio.gather방법? - 왜 우리는 해야 합니까?
await slow_task? - 이유는
Awaiting Slow코루틴이 시작된 것으로 보이는 후에 인쇄되었습니까? - 진정한 과제란 무엇입니까?나는 그것을
gather작업을 예약하는 중입니다.그리고.create_task작업을 생성하는 것으로 추정됩니다.
깊이 있는 답변을 주시면 감사합니다.감사합니다!
제가 퓨처스에 대해 아는 것이 거의 없다는 것도 언급할 가치가 있을 것입니다.
무엇인가.
asyncio.create_task()하십니까?
그것은 "백그라운드에서" 실행할 코루틴을 제출합니다. 즉, 현재 작업 및 다른 모든 작업과 동시에 실행하고 다음 시간에 전환합니다.await점수코루틴 실행을 취소하는 데 사용할 수 있는 "태스크"라는 대기 핸들을 반환합니다.
이것은 비동기의 핵심 요소 중 하나이며, 스레드를 시작하는 것과 같은 비동기입니다.(동일한 비유로, 작업을 기다리는 것입니다.await는 스레드를 결합하는 것과 같습니다.)
그래야 하지 않나요?
slow_task완료될 때까지 실행할 수 없습니다.fast_coro
아니요, 당신이 명시적으로 사용했기 때문입니다.create_task시작하기 위해slow_task뒤에서다음과 같은 글을 썼습니까?
slow_coro = counter_loop("Slow", 4)
fast_coro = counter_loop("Fast", 2)
fast_val = await fast_coro
...실제로.slow_coro아무도 이벤트 루프에 제출하지 않았기 때문에 실행되지 않습니다.그렇지만create_task정확히 그렇게 함: 다른 작업과 동시에 실행하기 위해 이벤트 루프에 제출합니다. 전환 지점은 임의입니다.await.
왜냐하면 그것은 결코 사용되지 않았기 때문입니다.
asyncio.gather방법?
asyncio.gather비동기식에서 동시성을 달성하는 유일한 방법은 아닙니다.단지 여러 코루틴이 모두 완료될 때까지 대기하고 동시에 이벤트 루프에 제출할 수 있도록 하는 유틸리티 기능입니다. create_task제출만 하는 건가요, 아마 전화했어야 했을 것입니다.start_coroutine아니면 그런 비슷한 것.
왜 우리는 기다려야 합니까?
slow_task?
그럴 필요는 없어요, 그냥 두 코루틴이 깨끗하게 끝날 때까지 기다리는 역할을 합니다.코드는 또한 기다릴 수 있었습니다.asyncio.sleep()아니면 그런 비슷한 것.돌아오는 길main()(및 이벤트 루프) 일부 작업이 보류 중인 상태에서 즉시 작동할 수도 있지만 버그 가능성을 나타내는 경고 메시지가 표시됩니다.이벤트 루프를 중지하기 전에 작업을 대기(또는 취소)하는 것이 더 좋습니다.
진정한 과제란 무엇입니까?
이것은 구체적인 이벤트 루프에서 코루틴의 실행을 추적하는 비동기 구조입니다.에 전화할 때.create_task당신은 집행을 위해 코루틴을 제출하고 핸들을 돌려받습니다.실제로 결과가 필요할 때 이 핸들을 기다릴 수도 있고, 결과에 관심이 없다면 절대 기다릴 수도 없습니다.이 핸들이 작업이며 다음에서 상속됩니다.Future할 수 "콜백"과 수준의 인터페이스를 합니다.add_done_callback.
언급URL : https://stackoverflow.com/questions/62528272/what-does-asyncio-create-task-do
'programing' 카테고리의 다른 글
| NSA 배열을 알파벳 순으로 정렬하는 방법은 무엇입니까? (0) | 2023.05.02 |
|---|---|
| Mongoose - ObjectId 배열에 채우기 사용 (0) | 2023.05.02 |
| 엑셀이 UTF-8 CSV 파일을 자동으로 인식하도록 강제할 수 있습니까? (0) | 2023.04.27 |
| String. 무시 대소문자 바꾸기 (0) | 2023.04.27 |
| 각도 2에서 다른 구성 요소 함수를 호출하는 방법 (0) | 2023.04.27 |