"Fire and Forget" Python Async/Await
비동기 프로그래밍에서는 기다리지 않고 중요하지 않은 작업을 수행하는 것이 유용할 수 있습니다. 그들의 완성. Tornado에서는 코루틴에서 Yield 키워드를 생략하여 "실행 후 잊어버리기" 동작을 수행할 수 있습니다. 그러나 Python 3.5의 async/await 구문에서 이 접근 방식을 사용하면 런타임 경고가 발생하고 원하는 작업이 실행되지 않습니다.
해결책: asyncio.Task
asyncio.Task에 대한 Python 문서에 따르면 "백그라운드에서" 코루틴을 실행할 수 있다고 합니다. asyncio.ensure_future를 사용하여 작업을 생성하면 실행이 차단되지 않고 "실행 후 잊어버리기" 동작과 유사하게 함수가 즉시 반환됩니다.
import asyncio async def async_foo(): print("async_foo started") await asyncio.sleep(1) print("async_foo done") async def main(): asyncio.ensure_future(async_foo()) # fire and forget async_foo() # Perform other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
출력:
async_foo started Do some actions 1 async_foo done Do some actions 2 Do some actions 3
보류 중인 작업 처리
이벤트 루프가 종료된 후에도 작업이 계속 실행 중인 경우 완료되면 경고가 표시될 수 있습니다. 이를 방지하기 위해 이벤트 루프가 완료되면 보류 중인 모든 작업을 기다릴 수 있습니다.
# Let's also finish all running tasks: pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
작업 취소
경우에 따라 작업을 취소해야 할 수도 있습니다. 완료되지 않을 것으로 예상되는 항목입니다. 이는 task.cancel()을 사용하여 달성할 수 있습니다:
# Let's also cancel all running tasks: pending = asyncio.Task.all_tasks() for task in pending: task.cancel() # Now we should await task to execute it's cancellation. # Cancelled task raises asyncio.CancelledError that we can suppress: with suppress(asyncio.CancelledError): loop.run_until_complete(task)
위 내용은 Python 3.5의 Async/Await에서 'Fire and Forget' 동작을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!