asyncio.vmdk_future vs.BaseEventLoop.create_task 대 단순 코루틴?
저는 비동기식에 대한 몇 가지 기본적인 파이썬 3.5 튜토리얼이 다양한 맛으로 동일한 작업을 수행하는 것을 보았습니다.다음 코드에서:
import asyncio
async def doit(i):
print("Start %d" % i)
await asyncio.sleep(3)
print("End %d" % i)
return i
if __name__ == '__main__':
loop = asyncio.get_event_loop()
#futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)]
#futures = [loop.create_task(doit(i)) for i in range(10)]
futures = [doit(i) for i in range(10)]
result = loop.run_until_complete(asyncio.gather(*futures))
print(result)
위의 세 가지 변형은 다음을 정의합니다.futures
변수는 동일한 결과를 달성합니다. 제가 볼 수 있는 유일한 차이점은 세 번째 변형의 실행이 순서가 맞지 않는다는 것입니다(대부분의 경우 문제가 되지 않음).또 다른 차이점이 있습니까?가장 단순한 변형(코루틴의 일반 목록)을 사용할 수 없는 경우가 있습니까?
실제 정보:
3 Python 3.7 버전asyncio.create_task(coro)
이를 위해 고급 기능이 추가되었습니다.
당신은 다른 방법으로 작업을 작성하는 대신에 그것을 사용해야 합니다. 임의의에는 그나임대상서작생하경는우는에야를 .asyncio.ensure_future(obj)
.
이전 정보:
ensure_future
대create_task
ensure_future
는 에서 생성하는 메서드입니다.인수를 기반으로 다양한 방법으로 작업을 만듭니다(사용 포함).create_task
코루틴 및 미래와 유사한 물체의 경우).
create_task
는 추상적방법다니입의 입니다.AbstractEventLoop
다른 이벤트 루프는 이 기능을 다른 방식으로 구현할 수 있습니다.
당신은 야합다니해를 사용해야 .ensure_future
작업을 생성합니다.필요할 것입니다.create_task
고유한 이벤트 루프 유형을 구현할 경우에만 가능합니다.
업데이트:
@bj0는 이 주제에 대한 Guido의 답변을 가리켰습니다.
의
ensure_future()
만약 당신이 코루틴이나 a일 수 있는 것을 가지고 있다면.Future
(에는 (후를는포다니합함자▁a다)가 포함됩니다Task
왜냐하면 그것은 하위 클래스이기 때문입니다.Future
), 에할 수Future
(유일한 유용한 예에 대해 설명합니다.cancel()
)일 때Future
(또는)Task
이것은 아무것도 하지 않습니다; 그것이 코루틴일 때 그것은 그것을 포장합니다.Task
..
create_task()
당신이 전화해야 할 유일한 시간은ensure_future()
"Asyncio 자체 API"를 수락하는 API의 asyncio를입니다.Future
그리고 당신은 그것에 대해 당신이 필요로 하는 무언가를 해야 합니다.Future
.
이후:
결국 나는 여전히 그것을 믿습니다.
ensure_future()
거의 필요하지 않은 기능의 이름입니다. 이름의 코에서태를생성때할는적이합사니다름용야해을절한을 해야 합니다.loop.create_task()
아마도 그것에 대한 가명이 있어야 할 것입니다.asyncio.create_task()
?
그것은 저에게 놀라운 일입니다.나의 주된 사용 동기는ensure_future
루프의 멤버에 비해 높은 수준의 기능입니다.create_task
(설명에는 추가와 같은 몇 가지 아이디어가 포함되어 있습니다.asyncio.spawn
또는asyncio.create_task
).
저는 또한 제 생각에 어떤 것이든 처리할 수 있는 보편적인 기능을 사용하는 것이 매우 편리하다고 지적할 수 있습니다.Awaitable
코루틴만 있는 것보다는.
그러나 Guido의 대답은 명확합니다: "코루틴에서 태스크를 생성할 때는 적절한 이름을 사용해야 합니다."
코루틴은 언제 작업에 포장되어야 합니까?
작업에서 코루틴 랩 - 이 코루틴을 "백그라운드"에서 시작하는 방법입니다.다음은 예입니다.
import asyncio
async def msg(text):
await asyncio.sleep(0.1)
print(text)
async def long_operation():
print('long_operation started')
await asyncio.sleep(3)
print('long_operation finished')
async def main():
await msg('first')
# Now you want to start long_operation, but you don't want to wait it finised:
# long_operation should be started, but second msg should be printed immediately.
# Create task to do so:
task = asyncio.ensure_future(long_operation())
await msg('second')
# Now, when you want, you can await task finised:
await task
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
출력:
first
long_operation started
second
long_operation finished
▁you▁can있습수를 대체할 수 있습니다.asyncio.ensure_future(long_operation())
정하로await long_operation()
차이를 느낄 수 있습니다.
create_task()
- 코루틴을 받아들입니다.
- 작업을 반환합니다.
- 루프의 컨텍스트에서 호출됩니다.
ensure_future()
- 선물, 코루틴, 기다리는 물건들을 받아들입니다
- 작업(또는 미래가 지난 경우 미래)을 반환합니다.
- 은 주진 arg가 사는코경루우인틴용하어경을 사용합니다.
create_task
, - 루프 개체를 전달할 수 있습니다.
보다시피 create_task가 더 구체적입니다.
async
없이 를 실행합니다.
호출 순호출async
은 coroutine을 합니다.
>>> async def doit(i):
... await asyncio.sleep(3)
... return i
>>> doit(4)
<coroutine object doit at 0x7f91e8e80ba0>
그리고 후드 아래는 다음을 보장합니다.ensure_future
라는 것,으로 ) Arg가 미래것을명시으로적는라▁)로으명,적시▁ar것을.ensure_future
중복됩니다.
유사한 질문 loop.create_task, asyncio의 차이점은 무엇입니까?비동기/보장_미래 및 작업?
참고: Python 3.7에만 유효합니다(Python 3.5의 경우 이전 답변 참조).
공식 문서에서:
asyncio.create_task
(Python 3.7에 추가됨)이 대신 새 작업을 생성하는 데 선호되는 방법입니다.
세부 정보:
이제 Python 3.7 이후 버전에서는 두 가지 최상위 래퍼 기능(비슷하지만 다름)이 있습니다.
asyncio.create_task
그냥 직접 전화하는 겁니다(소스 코드 참조)ensure_future
또한 코루틴인지 아니면 단순히 반환 유형이 비동기인지 확인하기 위한 것입니다.미래. (소스 코드 참조).어쨌든,Task
전히입니다.Future
클래스 상속(ref)으로 인해.
음, 궁극적으로 이 두 포장지 기능 모두 당신이 전화하는 데 도움이 될 것입니다.유일한 차이점은ensure_future
모든 개체를 수락하고 이 개체를 미래로 변환하는 데 도움이 됩니다.그리고 당신은 또한 당신의 것을 제공할 수 있습니다.event_loop
변수는 의매변수에 있습니다.ensure_future
이러한 기능이 필요한지 여부에 따라 사용할 래퍼를 선택할 수 있습니다.
예를 들어 세 가지 유형이 모두 비동기식으로 실행됩니다.유일한 차이점은 세 번째 예제에서는 10개의 코루틴을 모두 사전 생성하고 함께 루프에 제출했기 때문에 마지막 코루틴만 랜덤하게 출력된다는 것입니다.
언급URL : https://stackoverflow.com/questions/36342899/asyncio-ensure-future-vs-baseeventloop-create-task-vs-simple-coroutine
'it-source' 카테고리의 다른 글
.NET 4.0은 Windows XP SP2 이하와 호환됩니까? (0) | 2023.05.26 |
---|---|
mongoose의 개체 (0) | 2023.05.26 |
거부된 마스터 -> 마스터(비고속 포워드) (0) | 2023.05.26 |
Xcode 소스 자동 포맷 (0) | 2023.05.26 |
Express.js req.body가 정의되지 않았습니다. (0) | 2023.05.26 |