Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Benar-benar Mencapai "Fire and Forget" dengan Python's Async/Await?

Bagaimana untuk Benar-benar Mencapai "Fire and Forget" dengan Python's Async/Await?

Patricia Arquette
Patricia Arquetteasal
2024-11-09 01:38:02869semak imbas

How to Truly Achieve

"Fire and Forget" dengan Python's Async/Await

Dalam sintaks async/menunggu Python, melaksanakan fungsi tak segerak tanpa menunggu ia akan' t mencapai kesan "api dan lupa" yang diingini. Sebaliknya, program keluar dengan amaran masa jalan.

asyncio.Task untuk "Fire and Forget"

Untuk melaksanakan "fire and forget" dalam asyncio, gunakan asyncio. Tugas untuk mencipta tugasan yang melaksanakan operasi yang diingini di latar belakang. Dengan menggunakan asyncio.ensure_future(async_foo()), tugasan yang dikaitkan dengan async_foo() dimulakan dan tidak menunggu untuk selesai. Ini ialah pendekatan yang mudah tetapi berkesan untuk operasi tak segerak yang tidak perlu ditunggu secara eksplisit.

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

Menyelesaikan Tugasan Belum Selesai

Perhatikan bahawa tugasan dibuat menggunakan asyncio. Tugasan dijangka selesai sebelum gelung acara selesai. Jika tugasan masih belum selesai, amaran akan dijana. Untuk mengelakkan perkara ini, tunggu dengan jelas semua tugas yang belum selesai sebaik sahaja gelung acara selesai.

async def main():
    asyncio.ensure_future(async_foo())  # Fire and forget async_foo()

    loop = asyncio.get_event_loop()
    await asyncio.gather(*asyncio.Task.all_tasks())

Membatalkan Tugasan Daripada Menunggu

Sebagai alternatif, jika anda tidak mahu menunggu tugasan tertentu selama-lamanya, anda boleh membatalkannya:

async def echo_forever():
    while True:
        print("Echo")
        await asyncio.sleep(1)


async def main():
    asyncio.ensure_future(echo_forever())  # Fire and forget echo_forever()

    loop = asyncio.get_event_loop()
    for task in asyncio.Task.all_tasks():
        task.cancel()
        with suppress(asyncio.CancelledError):
            await task

Atas ialah kandungan terperinci Bagaimana untuk Benar-benar Mencapai "Fire and Forget" dengan Python's Async/Await?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn