Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Anda Boleh Melaksanakan 'Fire and Forget' dengan Python's Async/Await?

Bagaimanakah Anda Boleh Melaksanakan 'Fire and Forget' dengan Python's Async/Await?

DDD
DDDasal
2024-11-09 04:46:02820semak imbas

How Can You Implement

"Fire and Forget" dengan Python Async/Await

Pengenalan

Pengaturcaraan tak segerak dalam Python selalunya melibatkan tugas yang tidak memerlukan perhatian segera. Satu pendekatan untuk mengendalikan tugasan tersebut ialah menggunakan corak "fire and forget", yang membenarkan tugasan dijalankan serentak tanpa menyekat aliran pelaksanaan utama.

"Fire and Forget" dengan Async/Await

Dalam pelaksanaan coroutine Tornado, corak ini boleh dicapai dengan mengabaikan kata kunci hasil. Walau bagaimanapun, dalam Python 3.5 dan seterusnya, sintaks async/wait memerlukan pendekatan yang berbeza.

asyncio.Task to "Fire and Forget"

Menurut dokumentasi Python untuk asyncio.Task, coroutines boleh dilaksanakan "di latar belakang" dengan menggunakan asyncio.ensure_future untuk mencipta tugas. Tugasan ini akan dijalankan serentak tanpa menyekat fungsi.

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 ...

Mengendalikan Tugasan Belum Selesai

Secara lalai, asyncio menjangkakan tugasan akan diselesaikan sebelum gelung acara selesai. Jika tugasan masih berjalan selepas gelung acara selesai, amaran akan dikeluarkan. Untuk mengelakkan amaran ini, semua tugas yang belum selesai perlu ditunggu selepas gelung acara selesai.

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

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

Membatalkan Tugas

Dalam sesetengah kes, tugasan mungkin perlu dibatalkan dan bukannya ditunggu. Ini boleh dilakukan menggunakan task.cancel(), tetapi tugasan yang dibatalkan perlu ditunggu untuk menyelesaikan pembatalannya.

# ... 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)

Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Melaksanakan '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