코 루틴은 값을 산출하고 외부에서 값을받을 수있는 생성기 함수입니다. 코 루틴 사용의 이점은 함수 실행을 일시 중지하고 나중에 다시 시작할 수 있다는 것입니다. 네트워크 작업의 경우 응답을 기다리는 동안 함수 실행을 일시 중지하는 것이 좋습니다. 시간을 사용하여 다른 기능을 실행할 수 있습니다.
미래는 Promise
자바 스크립트 의 객체 와 같습니다 . 미래에 구체화 될 가치에 대한 자리 표시 자입니다. 위에서 언급 한 경우 네트워크 I / O를 기다리는 동안 함수는 컨테이너를 제공하여 작업이 완료되면 컨테이너를 값으로 채울 것임을 약속합니다. 우리는 미래의 객체를 붙잡고 그것이 충족되면 실제 결과를 검색하기 위해 그것에 대한 메소드를 호출 할 수 있습니다.
직접 답변 : 당신은 필요하지 않습니다 ensure_future
당신은 결과가 필요하지 않은 경우. 결과가 필요하거나 예외가 발생한 경우 유용합니다.
추가 크레딧 : 최대 작업자 수를 제어하기 run_in_executor
위해 Executor
인스턴스를 선택 하고 전달합니다 .
설명 및 샘플 코드
첫 번째 예에서는 코 루틴을 사용하고 있습니다. 이 wait
함수는 많은 코 루틴을 가져 와서 함께 결합합니다. 따라서 wait()
모든 코 루틴이 소진되면 완료됩니다 (모든 값을 반환하는 완료 / 완료 됨).
loop = get_event_loop() #
loop.run_until_complete(wait(coros))
이 run_until_complete
메서드는 실행이 완료 될 때까지 루프가 살아 있는지 확인합니다. 이 경우 비동기 실행의 결과를 얻지 못하는 것을 주목하십시오.
두 번째 예제에서는 ensure_future
함수를 사용하여 코 루틴을 래핑 Task
하고 일종의 Future
. 코 루틴은를 호출 할 때 메인 이벤트 루프에서 실행되도록 예약되어 있습니다 ensure_future
. 반환 된 미래 / 작업 객체에는 아직 값이 없지만 시간이 지남에 따라 네트워크 작업이 완료되면 미래 객체가 작업 결과를 보유합니다.
from asyncio import ensure_future
futures = []
for i in range(5):
futures.append(ensure_future(foo(i)))
loop = get_event_loop()
loop.run_until_complete(wait(futures))
따라서이 예제에서는 코 루틴을 사용하는 대신 퓨처를 사용하는 것을 제외하고는 동일한 작업을 수행합니다.
asyncio / coroutines / futures를 사용하는 방법의 예를 살펴 보겠습니다.
import asyncio
async def slow_operation():
await asyncio.sleep(1)
return 'Future is done!'
def got_result(future):
print(future.result())
# We have result, so let's stop
loop.stop()
loop = asyncio.get_event_loop()
task = loop.create_task(slow_operation())
task.add_done_callback(got_result)
# We run forever
loop.run_forever()
여기에서는 객체 create_task
에 대한 메서드를 사용했습니다 loop
. ensure_future
메인 이벤트 루프에서 작업을 예약합니다. 이 방법을 사용하면 선택한 루프에서 코 루틴을 예약 할 수 있습니다.
add_done_callback
작업 객체 의 메서드를 사용하여 콜백을 추가하는 개념도 확인했습니다 .
A Task
는 done
코 루틴이 값을 반환하거나 예외를 발생 시키거나 취소되는 경우입니다. 이러한 사건을 확인하는 방법이 있습니다.
도움이 될만한 다음 주제에 대한 블로그 게시물을 작성했습니다.
물론 공식 매뉴얼 ( https://docs.python.org/3/library/asyncio.html) 에서 자세한 내용을 확인할 수 있습니다.
ensure_future()
합니까? 결과가 필요하면 그냥 사용할 수run_until_complete(gather(coros))
없습니까?