특정 시나리오에서는 완료될 때까지 기다릴 필요가 없는 비동기 작업을 시작해야 할 필요가 있습니다. . 전통적으로 Tornado 코루틴의 "실행 후 잊어버리기" 접근 방식은 항복 키워드를 생략하여 달성할 수 있습니다.
그러나 Python 3.5의 async/await 구문에서 이러한 구현은 코루틴이 실행 중임을 나타내는 RuntimeWarning을 발생시킵니다. 결코 기다려지지 않았습니다.
다행히 Python의 asyncio 라이브러리는 asyncio.Task 클래스를 통해 솔루션을 제공합니다. 이를 통해 기본 실행을 차단하지 않고 백그라운드에서 실행할 수 있는 작업을 생성할 수 있습니다.
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() # continue with other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
이 접근 방식을 사용하면 async_foo()가 비동기적으로 실행되는 동시에 다른 작업이 기다리지 않고 계속될 수 있습니다.
이벤트 루프가 완료되면 asyncio는 모든 작업이 완료될 것으로 예상한다는 점에 유의하는 것이 중요합니다. 따라서 보류 중인 나머지 작업이 있으면 경고가 발생할 수 있습니다. 이를 방지하려면 보류 중인 모든 작업을 기다리거나 취소할 수 있습니다.
옵션 1: 보류 중인 작업 대기
pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
옵션 2: 보류 취소 작업
pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): loop.run_until_complete(task)
작업을 취소하면 제거됩니다. 이벤트 루프의 일정에서 잠재적인 경고를 방지합니다.
위 내용은 Python Async/Await에서 'Fire and Forget' 비동기 작업을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!