Tugas dicipta daripada coroutine. Ia mengambil objek coroutine, membungkus coroutine, menjadualkannya untuk pelaksanaan dan menyediakan kaedah untuk berinteraksi dengannya. Tugas dilaksanakan secara bebas. Ini bermakna ia dijadualkan dalam gelung acara asyncio dan akan dilaksanakan tanpa mengira apa yang berlaku dalam coroutine yang menciptanya. Ini berbeza daripada melaksanakan coroutine secara langsung, di mana pemanggil mesti menunggu sehingga selesai.
Kelas asyncio.Task memanjangkan kelas asyncio.Future, contoh yang boleh ditunggu. Masa hadapan ialah kelas peringkat rendah yang mewakili hasil yang akhirnya akan tiba. Kelas yang memanjangkan kelas Masa Depan sering dipanggil seperti Masa Depan.
Oleh kerana tugas tak segerak menanti, ini bermakna coroutine boleh menggunakan ekspresi menunggu untuk menunggu tugasan selesai.
... # wait for a task to be done await task
Sekarang kita tahu apa itu tugas asyncio, mari lihat cara menciptanya.
2. Cara membuat tugasan
# define a coroutine async def task_coroutine(): # ...
Tugas hanya boleh dibuat dan dijadualkan dalam coroutine. Terdapat dua cara utama untuk mencipta dan menjadualkan tugasan, iaitu:
... # create a coroutine coro = task_coroutine() # create a task from a coroutine task = asyncio.create_task(coro)
Ini boleh dicapai dengan menggunakan pernyataan majmuk dalam satu baris.
... # create a task from a coroutine task = asyncio.create_task(task_coroutine())
Ini akan melakukan beberapa perkara:
2.2. API peringkat rendah
Kaedah pertama ialah menggunakan fungsi asyncio.ensure_future(). Fungsi ini mengambil tugasan, masa depan atau objek seperti masa depan seperti coroutine dan secara pilihan gelung untuk menjadualkannya. Jika tiada gelung disediakan, ia akan dijadualkan dalam gelung peristiwa semasa.
Jika coroutine disediakan untuk fungsi ini, ia akan dibalut dalam contoh untuk kami dan dikembalikan.
... # create and schedule the task task = asyncio.ensure_future(task_coroutine())
Satu lagi fungsi peringkat rendah yang boleh kami gunakan untuk mencipta dan menjadualkan tugas ialah kaedah loop.create_task(). Fungsi ini memerlukan akses kepada gelung peristiwa tertentu di mana coroutine dilaksanakan sebagai tugas.
Kita boleh mendapatkan contoh gelung peristiwa semasa dalam program asyncio melalui fungsi asyncio.get_event_loop(). Ini kemudiannya boleh digunakan untuk memanggil kaedah create_task() untuk mencipta contoh Tugas dan menjadualkannya untuk pelaksanaan.
... # get the current event loop loop = asyncio.get_event_loop() # create and schedule the task task = loop.create_task(task_coroutine())
3. Bilakah tugasan itu akan dijalankan?
Walaupun kami boleh menjadualkan coroutine untuk dijalankan secara bebas sebagai tugasan melalui fungsi create_task(), ia mungkin tidak berjalan serta-merta. Malah, tugas itu tidak akan dilaksanakan sehingga gelung acara mempunyai peluang untuk dijalankan.
Ini tidak akan berlaku sehingga semua coroutine lain tidak berjalan dan giliran tugas untuk dijalankan.
Contohnya, jika kita mempunyai program asyncio dengan coroutine yang mencipta dan menjadualkan tugas, tugasan yang dijadualkan tidak akan dijalankan sehingga coroutine panggilan yang mencipta tugas itu digantung.
Ini mungkin berlaku jika coroutine yang memanggil memilih untuk tidur, memilih untuk menunggu coroutine atau tugas lain atau memilih untuk menunggu tugasan baharu yang telah dijadualkan.
... # create a task from a coroutine task = asyncio.create_task(task_coroutine()) # await the task, allowing it to run await task
Sekarang kita tahu apakah tugasan itu dan cara menjadualkannya.
Atas ialah kandungan terperinci Bagaimana untuk mencipta dan menjalankan tugas tak segerak dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!