>백엔드 개발 >파이썬 튜토리얼 >Python의 Async/Await를 사용하여 'Fire and Forget'을 어떻게 구현할 수 있습니까?

Python의 Async/Await를 사용하여 'Fire and Forget'을 어떻게 구현할 수 있습니까?

DDD
DDD원래의
2024-11-09 04:46:02853검색

How Can You Implement

Python Async/Await를 사용한 "Fire and Forget"

소개

Python의 비동기 프로그래밍에는 즉각적인 주의가 필요하지 않은 작업이 포함되는 경우가 많습니다. 이러한 작업을 처리하는 한 가지 접근 방식은 "Fire and Forget" 패턴을 사용하는 것입니다. 이를 통해 기본 실행 흐름을 차단하지 않고 작업을 동시에 실행할 수 있습니다.

Async/Await를 사용한 "Fire and Forget"

Tornado의 코루틴 구현에서 이 패턴은 Yield 키워드를 생략하여 달성할 수 있습니다. 그러나 Python 3.5 이상에서는 async/await 구문에 다른 접근 방식이 필요합니다.

asyncio.Task를 "Fire and Forget"으로

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()

    # ... Other code can be executed here ...

보류 중인 작업 처리

기본적으로 asyncio는 이벤트 루프가 완료되기 전에 작업이 완료될 것으로 예상합니다. 이벤트 루프가 완료된 후에도 작업이 계속 실행 중이면 경고가 발생합니다. 이 경고를 피하려면 이벤트 루프가 완료된 후 보류 중인 모든 작업을 기다려야 합니다.

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

# Wait for any remaining tasks
pending = asyncio.Task.all_tasks()
await asyncio.gather(*pending)

작업 취소

어떤 경우에는 대기 대신 작업을 취소해야 할 수도 있습니다. task.cancel()을 사용하여 이 작업을 수행할 수 있지만 취소된 작업이 취소를 완료할 때까지 기다려야 합니다.

# ... Same code as before ...

# Cancel all running tasks
pending = asyncio.Task.all_tasks()
for task in pending:
    task.cancel()
    with suppress(asyncio.CancelledError):
        await asyncio.wait_for(task, timeout=None)

위 내용은 Python의 Async/Await를 사용하여 'Fire and Forget'을 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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