Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan coroutine dalam pengaturcaraan serentak python

Cara menggunakan coroutine dalam pengaturcaraan serentak python

王林
王林ke hadapan
2023-05-13 08:16:051300semak imbas

Apakah itu coroutine?

Coroutine ialah kaedah konkurensi yang lebih ringan daripada utas Ia tidak memerlukan overhed penukaran konteks benang dan boleh mencapai konkurensi dalam satu utas. Coroutine biasanya mempunyai ciri-ciri berikut:

  • Kod dalam coroutine boleh menggantung pelaksanaan dan menyambung semula pelaksanaan apabila diperlukan.

  • Berbilang coroutine boleh dilaksanakan serentak dalam urutan yang sama, tetapi hanya satu coroutine sedang dilaksanakan pada bila-bila masa.

  • Coroutine biasanya dilaksanakan berdasarkan gelung peristiwa (Gelung Acara), dan gelung peristiwa bertanggungjawab untuk menjadualkan pelaksanaan coroutine.

Coroutine dan thread

Thread dan coroutine ialah kedua-dua cara untuk melaksanakan pengaturcaraan serentak, tetapi mereka mempunyai beberapa ciri dan senario aplikasi yang berbeza.

**Benang ialah unit asas penjadualan sistem pengendalian **Setiap utas mempunyai konteks pelaksanaannya sendiri, termasuk susunan benang, daftar, dsb. Bertukar antara utas memerlukan penukaran konteks, termasuk operasi seperti menyimpan konteks utas semasa dan memulihkan konteks utas lain Operasi ini memakan banyak masa dan sumber. Dalam pengaturcaraan berbilang benang, penukaran benang adalah operasi yang sangat biasa atas sebab berikut:

  1. penjadualan. Apabila berbilang utas dilaksanakan pada masa yang sama, sistem pengendalian perlu menjadualkan utas ini dan menentukan utas mana yang harus dilaksanakan pada masa ini berdasarkan faktor seperti keutamaan. Penukaran benang ialah salah satu operasi asas penjadualan Dengan menukar benang, sistem pengendalian boleh mencapai pelaksanaan serentak berbilang benang.

  2. Tunggu. Apabila utas perlu menunggu peristiwa berlaku, seperti menunggu operasi IO selesai, menunggu kunci dilepaskan, dsb., utas boleh melepaskan CPU secara aktif untuk memberi peluang kepada utas lain untuk dilaksanakan. Selepas penantian selesai, benang boleh dibangkitkan semula dan pelaksanaan diteruskan.

  3. Keselarasan. Thread boleh mencapai kesan pelaksanaan serentak Contohnya, satu thread mengendalikan permintaan rangkaian dan thread lain mengendalikan interaksi pengguna Ini boleh meningkatkan kelajuan tindak balas dan keupayaan pemprosesan sistem.

  4. Tukar kepada urutan lain untuk pelaksanaan. Dalam sesetengah kes, utas mungkin tidak dapat meneruskan pelaksanaan kerana beberapa sebab, seperti utas memasuki gelung tak terhingga atau pengecualian berlaku Pada masa ini, adalah perlu untuk beralih kepada urutan lain untuk pelaksanaan untuk mengelakkan ranap sistem atau masalah lain.

Pengaturcaraan serentak urutan biasanya dihadkan oleh masalah seperti persaingan berbilang benang, kebuntuan dan penukaran konteks. Dalam Python, apabila menggunakan pengaturcaraan berbilang benang, anda perlu memberi perhatian kepada isu seperti keselamatan benang dan GIL.

Coroutine ialah kaedah konkurensi ringan yang dilaksanakan dalam ruang pengguna dan tidak bergantung pada penjadualan sistem pengendalian. Coroutine boleh mencapai konkurensi dalam urutan yang sama tanpa penukaran konteks, jadi kecekapan pelaksanaan adalah sangat tinggi. Coroutine biasanya menggunakan gelung peristiwa (Gelung Acara) untuk menjadualkan pelaksanaan coroutine Apabila coroutine perlu menunggu operasi IO atau coroutine lain, gelung peristiwa akan menggantung pelaksanaan coroutine semasa dan melaksanakan coroutine lain, dengan itu mencapai pelaksanaan serentak. Kesan. Dalam Python, coroutine biasanya dilaksanakan menggunakan modul asyncio, yang menyokong IO tak segerak, pengaturcaraan rangkaian, penjadualan tugas dan senario lain.

Berbanding dengan benang, kelebihan utama coroutine termasuk:

  • Ia lebih ringan dan menggunakan lebih sedikit sumber; >Tidak perlu penukaran konteks, kecekapan pelaksanaan yang lebih tinggi;

  • Boleh menggunakan gelung acara untuk penjadualan untuk mencapai kesan serentak yang tinggi; dihadkan oleh GIL dan boleh menggunakan CPU berbilang teras dengan lebih baik.

  • Walau bagaimanapun, coroutine juga mempunyai beberapa had, seperti ketidakupayaan untuk menggunakan CPU berbilang teras, kesukaran dalam penyahpepijatan dan isu lain. Apabila memilih untuk menggunakan benang atau coroutine, anda perlu membuat pilihan berdasarkan senario aplikasi tertentu.

  • Aplikasi coroutine
  • Coroutines boleh digunakan dalam banyak senario, seperti:

Pengaturcaraan rangkaian: Coroutines boleh membantu kami mencapai aplikasi web konkurensi tinggi .

IO Asynchronous: Coroutines boleh membantu kami mengendalikan operasi IO tak segerak dengan cekap.

  • Operasi pangkalan data: Coroutines boleh membantu kami melaksanakan aplikasi pangkalan data yang sangat serentak.

  • Penjadualan tugas: Coroutines boleh membantu kami melaksanakan sistem penjadualan tugas yang cekap.

  • Demo Demo

  • Berikut ialah contoh kod yang menunjukkan cara menggunakan coroutine dan modul
  • untuk melaksanakan penjadualan tugas mudah:

    import asyncio
    
    async def task1():
        print("Task 1")
        await asyncio.sleep(1)
        print("Task 1 done")
    
    async def task2():
        print("Task 2")
        await asyncio.sleep(2)
        print("Task 2 done")
    
    
    async def task3():
        print("Task 3")
        await asyncio.sleep(3)
        print("Task 3 done")
    
    
    async def main():
        await asyncio.gather(task1(), task2(), task3())

    Kod ini menggunakan modul coroutine dan
  • Python, mentakrifkan tiga fungsi coroutine
,

,

dan fungsi coroutine utama

. Setiap fungsi coroutine mencetak nama tugasnya dan kemudian dijeda untuk satu tempoh masa. Fungsi coroutine utama menggunakan asyncio untuk melaksanakan tiga fungsi coroutine secara serentak, dan hasil keluaran akhir ialah:

Task 1
Task 2
Task 3
Task 1 done
Task 2 done
Task 3 done
[Finished in 3.2s]

Atas ialah kandungan terperinci Cara menggunakan coroutine dalam pengaturcaraan serentak python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam