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