it-source

asyncio.vmdk_future vs.BaseEventLoop.create_task 대 단순 코루틴?

criticalcode 2023. 5. 26. 21:09
반응형

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_futurecreate_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 이후 버전에서는 두 가지 최상위 래퍼 기능(비슷하지만 다름)이 있습니다.

음, 궁극적으로 이 두 포장지 기능 모두 당신이 전화하는 데 도움이 될 것입니다.유일한 차이점은ensure_future모든 개체를 수락하고 이 개체를 미래로 변환하는 데 도움이 됩니다.그리고 당신은 또한 당신의 것을 제공할 수 있습니다.event_loop 변수는 의매변수에 있습니다.ensure_future이러한 기능이 필요한지 여부에 따라 사용할 래퍼를 선택할 수 있습니다.

예를 들어 세 가지 유형이 모두 비동기식으로 실행됩니다.유일한 차이점은 세 번째 예제에서는 10개의 코루틴을 모두 사전 생성하고 함께 루프에 제출했기 때문에 마지막 코루틴만 랜덤하게 출력된다는 것입니다.

언급URL : https://stackoverflow.com/questions/36342899/asyncio-ensure-future-vs-baseeventloop-create-task-vs-simple-coroutine

반응형