>  기사  >  백엔드 개발  >  asyncio에서 코루틴 객체와 Future 객체를 사용하는 방법에 대한 자세한 설명

asyncio에서 코루틴 객체와 Future 객체를 사용하는 방법에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-03-28 15:28:172855검색

asyncio는 Python 버전 3.4에 도입된 표준 라이브러리로, 비동기 IO를 기본적으로 지원합니다. asyncio의 프로그래밍모델은 메시지루프입니다. 오늘은 코루틴과 Futureasyncio의 객체

">

코루틴과 Future

의 관계에 대해 자세히 논의하겠습니다. 둘 다인 것 같습니다. 마찬가지로, 다음 구문을 사용하여 결과를 비동기적으로 얻을 수 있기 때문에

result = await future
result = await coroutine

사실 코루틴은 외부에서 수신할 수 있는 생성기함수입니다. 매개변수도 결과를 생성할 수 있습니다. 코루틴을 사용하면 함수를 일시 중지한 다음 나중에 실행을 다시 시작할 수 있다는 것입니다. 예를 들어 네트워크 작업이 관련된 경우 응답이 도착할 때까지 함수를 중지할 수 있습니다.

그리고 Future는 Javascript의 Promise 객체에 더 가깝습니다. 위 예에서 값이 계산되는 자리 표시자입니다. 네트워크 IO 함수가 완료되기를 기다리고 있습니다. 함수는 컨테이너를 제공하고, 완료되면 Promise가 컨테이너를 채울 것입니다. 채우기 후에 콜백 함수 를 사용하여 이를 얻을 수 있습니다. 실제 결과

태스크 객체는 코루틴과 Future를 연결하고 코루틴을 Future 객체로 캡슐화하는 Future의 하위 클래스입니다.

일반적으로 작업을 시작하는 두 가지 방법을 볼 수 있습니다. >

tasks = asyncio.gather(
  asyncio.ensure_future(func1()),
  asyncio.ensure_future(func2())
)
loop.run_until_complete(tasks)

tasks = [
  asyncio.ensure_future(func1()),
  asyncio.ensure_future(func2())
  ]
loop.run_until_complete(asyncio.wait(tasks))
ensure_future는 코루틴을 작업으로 캡슐화할 수 있습니다. asyncio.gather는 일부 퓨처와 코루틴을 퓨처로 캡슐화합니다

asyncio.wait는

run_until_complete는 Future 객체 또는 코루틴 객체를 받을 수 있습니다. 종료하려면 CTRL-C를 사용하십시오. 예외가 발생하더라도 이벤트 루프의 작업은 오류를 보고하고 다음 오류가 나타납니다.

작업이 파괴되었지만 보류 중입니다!

작업 : <대기 중인 작업 coro= wait_for=<미래 보류 중인 cb=[Task._wakeup()]>>

공식 문서에 따르면 Task 개체는 다음 상황에서만 종료된 것으로 간주됩니다.

결과/예외가 가능하거나 future가 취소된 경우
Task 객체와 해당 상위 클래스 취소 Future는 약간 다릅니다. Task.cancel()이 호출되면 해당 코루틴은 event

루프의 다음 라운드에서 CancelledError 예외를 발생시킵니다. Future.cancelled()를 사용하면 True가 즉시 반환되지 않습니다(작업 종료를 나타내는 데 사용됨). 위 예외가 처리되고 작업이 종료된 후에만 취소된 것으로 간주됩니다.

따라서 작업을 종료하려면

BaseEventLoop.run_until_complete(future)
Run until the Future is done.
If the argument is a coroutine object, it is wrapped by ensure_future().
Return the Future's result, or raise its exception.
를 사용하여 모든 작업을 찾아 취소할 수 있습니다.

그러나 CTRL-C도 이벤트 루프를 중지하므로 이벤트 루프를 다시 시작해야 합니다.

for task in asyncio.Task.all_tasks():
  task.cancel()
확실하지 않은 경우 각 작업에서 예외를 포착해야 합니다.

asyncio.gather(..., return_Exceptions=True)

예외를 일반 결과로 변환하고 반환할 수 있습니다.

위 내용은 asyncio에서 코루틴 객체와 Future 객체를 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.