Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk mencipta dan menjalankan tugas tak segerak dalam Python

Bagaimana untuk mencipta dan menjalankan tugas tak segerak dalam Python

WBOY
Lepaskan: 2023-05-13 13:31:12
ke hadapan
1851 orang telah melayarinya

    1 Apakah itu tugas tak segerak? Ia menyediakan pemegang kepada coroutine yang dihantar yang program asyncio boleh bertanya dan digunakan untuk berinteraksi dengan coroutine.

    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
    Salin selepas log masuk

    Sekarang kita tahu apa itu tugas asyncio, mari lihat cara menciptanya.

    2. Cara membuat tugasan

    Buat tugasan menggunakan contoh coroutine yang disediakan. Ingat bahawa coroutine ditakrifkan menggunakan ungkapan async def dan kelihatan seperti fungsi.

    # define a coroutine
    async def task_coroutine():
    	# ...
    Salin selepas log masuk

    Tugas hanya boleh dibuat dan dijadualkan dalam coroutine. Terdapat dua cara utama untuk mencipta dan menjadualkan tugasan, iaitu:

      Gunakan API peringkat tinggi untuk mencipta tugasan (diutamakan)
    • Gunakan API peringkat rendah untuk membuat tugasan
    • 2.1 API Lanjutan

    Anda boleh menggunakan fungsi asyncio.create_task() untuk mencipta tugas. Fungsi asyncio.create_task() menerima tika coroutine dan nama tugas pilihan dan mengembalikan tika asyncio.Task.

    ...
    # create a coroutine
    coro = task_coroutine()
    # create a task from a coroutine
    task = asyncio.create_task(coro)
    Salin selepas log masuk

    Ini boleh dicapai dengan menggunakan pernyataan majmuk dalam satu baris.

    ...
    # create a task from a coroutine
    task = asyncio.create_task(task_coroutine())
    Salin selepas log masuk

    Ini akan melakukan beberapa perkara:

      Balut coroutine dalam contoh tugasan tak segerak.
    • Jadualkan tugas untuk pelaksanaan dalam gelung acara semasa.
    • Mengembalikan contoh tugasan
    • Kejadian tugas boleh dibuang, berinteraksi dengan melalui kaedah dan menunggu oleh coroutine. Ini ialah cara pilihan untuk membuat tugasan daripada coroutine dalam program asyncio.

    2.2. API peringkat rendah

    Anda juga boleh menggunakan API asyncio peringkat rendah untuk membuat tugasan daripada coroutine.

    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())
    Salin selepas log masuk

    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())
    Salin selepas log masuk

    3. Bilakah tugasan itu akan dijalankan?

    Persoalan biasa selepas mencipta tugasan ialah 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
    Salin selepas log masuk

    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!

    Label berkaitan:
    sumber:yisu.com
    Kenyataan Laman Web ini
    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
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan