실제 정보 :
이 목적을 위해 Python 3.7부터 asyncio.create_task(coro)
고급 기능 이 추가되었습니다 .
대신 coroutimes에서 작업을 만드는 다른 방법을 사용해야합니다. 그러나 임의의 awaitable에서 작업을 생성해야하는 경우 asyncio.ensure_future(obj)
.
이전 정보 :
ensure_future
vs create_task
ensure_future
에서 만드는 방법 Task
입니다 coroutine
. 인수에 따라 다른 방식으로 작업을 생성합니다 ( create_task
코 루틴 및 미래형 객체 에 대한 사용 포함 ).
create_task
의 추상 방법입니다 AbstractEventLoop
. 다른 이벤트 루프는이 기능을 다른 방식으로 구현할 수 있습니다.
ensure_future
작업을 생성하는 데 사용해야 합니다. create_task
자체 이벤트 루프 유형을 구현하려는 경우에만 필요 합니다.
업데이트 :
@ bj0 은이 주제에 대한 Guido의 답변 을 지적했습니다 .
요점은 ensure_future()
코 루틴 또는 a Future
(후자는 Task
의 하위 클래스이기 때문에 a가 포함됨 Future
)가 될 수 있고, Future
(아마 유일한 것에 대해) 정의 된 메서드를 호출 할 수 있기를 원하는 경우입니다. 유용한 예 cancel()
). 이미 a Future
(또는 Task
) 이면 아무 작업도 수행하지 않습니다. 그것은 코 루틴 인 경우는 랩 A의 그것 Task
.
코 루틴이 있다는 것을 알고 있고이를 예약하려는 경우 사용할 올바른 API는 create_task()
. 호출해야하는 유일한 시간 ensure_future()
은 코 루틴 또는 a를 허용하는 API (대부분의 asyncio 자체 API와 같이)를 제공 Future
하고 Future
.
이후 :
결국 나는 그것이 ensure_future()
거의 필요하지 않은 기능에 대한 적절하게 모호한 이름 이라고 여전히 믿습니다 . 코 루틴에서 작업을 생성 할 때 적절한 이름의
loop.create_task()
. 아마도 그것에 대한 별칭이 있어야
asyncio.create_task()
할까요?
놀랍습니다. ensure_future
함께 사용 하는 주된 동기 는 루프의 구성원과 비교하여 더 높은 수준의 기능이라는 것이 었습니다 create_task
(토론 에는 추가 asyncio.spawn
또는 같은 아이디어 가 포함되어 있습니다asyncio.create_task
).
또한 Awaitable
코 루틴 만 처리 할 수있는 것이 아니라 모든 것을 처리 할 수있는 범용 함수를 사용하는 것이 매우 편리하다고 생각합니다 .
그러나 Guido의 대답은 분명합니다. "코 루틴에서 작업을 만들 때는 적절한 이름을 사용해야합니다. loop.create_task()
"
코 루틴을 작업에 래핑해야하는 경우
코 루틴을 태스크에 래핑-이 코 루틴을 "백그라운드에서"시작하는 방법입니다. 예를 들면 다음과 같습니다.
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
차이를 느끼기 위해 asyncio.ensure_future(long_operation())
로 대체 할 수 있습니다 await long_operation()
.
create_task
일반적으로 필요하지 않은 작업 객체가 정말로 필요한 경우 사용해야합니다. github.com/python/asyncio/issues/477#issuecomment-268709555