Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan fungsi biasa asyncio Python?

Bagaimana untuk menggunakan fungsi biasa asyncio Python?

WBOY
WBOYke hadapan
2023-04-26 20:10:061640semak imbas

Takrif coroutine

perlu menggunakan pernyataan async def

Apa yang boleh dilakukan oleh coroutine:

1 Tunggu keputusan masa hadapan

2 , tunggu coroutine lain (hasilkan keputusan atau bangkitkan pengecualian)

3. Hasilkan hasil kepada coroutine yang menunggunya

4. Lemparkan pengecualian kepada coroutine yang sedang menunggu for it Program

Run of coroutine

Panggil fungsi coroutine, coroutine tidak akan mula berjalan, ia hanya mengembalikan objek coroutine

Terdapat dua cara untuk menjalankan coroutine objek Kaedah:

1. Gunakan await untuk menunggunya dalam coroutine lain yang sudah berjalan

2. Rancang pelaksanaannya melalui fungsi ensure_future

Hanya tertentu sahaja apabila gelung benang sedang berjalan bolehkah coroutine dijalankan

Contoh berikut:

Mula-mula dapatkan gelung lalai benang semasa, dan kemudian serahkan objek coroutine kepada loop.run_until_complete, coroutine Objek kemudiannya akan dijalankan dalam gelung

loop = asyncio.get_event_loop()
loop.run_until_complete(do_some_work(3))

run_until_complete ialah panggilan menyekat Ia tidak akan kembali sehingga coroutine selesai dijalankan

Parameternya ialah masa depan, tetapi apa kita luluskan kepadanya Ia adalah objek coroutine Ia melakukan pemeriksaan dalaman dan membungkus objek coroutine ke masa hadapan

melalui fungsi ensure_future Kita boleh menulis seperti ini:

loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))

Berbilang coroutine berjalan<.>

Berbilang coroutine dijalankan dalam gelung Untuk menyerahkan berbilang coroutine ke gelung, anda perlu menggunakan fungsi

asyncio.gathre

loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))

atau menyimpan objek coroutine ke senarai ini adalah lebih biasa.

loop = asyncio.get_event_loop() #获取当前线程loop
coros_list = []
for i in range(2000):
    coros_list.append(main(i))
loop.run_until_complete(asyncio.gather(*coros_list))

berkumpul bertindak sebagai pengagregatan, membungkus berbilang niaga hadapan ke dalam satu masa hadapan, kerana loop.run_until_complete hanya menerima satu masa hadapan.

Perihal loop.close()

Ringkasnya, selagi gelung tidak ditutup, ia masih boleh dijalankan. :

loop = asyncio.get_event_loop() #获取当前线程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.run_until_complete(do_some_work(loop, 3))
loop.close()

Tetapi jika ia ditutup, ia tidak boleh dijalankan lagi:

loop = asyncio.get_event_loop() #获取当前线程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.close()
loop.run_until_complete(do_some_work(loop, 3))  # 此处异常

Panggil balik

Menyertai coroutine ialah operasi membaca IO Selepas dia selesai membaca data, Kami ingin dimaklumkan untuk pemprosesan selanjutnya data. Ini boleh dicapai dengan menambahkan panggilan balik pada masa hadapan

def done_callback(futu):
    print(&#39;Done&#39;)
futu = asyncio.ensure_future(do_some_work(3))
futu.add_done_callback(done_callback)
loop.run_until_complete(futu)

Gelung peristiwa

Gelung acara akan menjalankan tugas dan panggilan balik tak segerak, melaksanakan operasi IO rangkaian dan menjalankan proses anak

Daripada gelung peristiwa asyncio Dalam dokumen dasar, kami mengetahui bahawa dasar gelung peristiwa ialah objek global proses yang mengawal pengurusan semua gelung peristiwa dalam proses.

Dasar global proses mentakrifkan maksud konteks yang dikawal oleh dasar dan mengurus gelung peristiwa yang berasingan dalam setiap konteks Konteks yang ditakrifkan oleh dasar lalai ialah urutan semasa, yang bermaksud urutan yang berbeza Konteks yang berbeza, oleh itu gelung peristiwa yang berbeza.

Dapatkan gelung acara

asyncio.get_running_loop() # 返回当前os线程中正在运行的事件循环
asyncio.get_event_loop() # 获取当前事件循环
asyncio.set_event_loop(loop) # 获取当前事件循环
asyncio.new_event_loop() # 创建并返回一个新的事件循环对象

asyncio.get_event_loop()

Jika:

  • Urutan semasa ialah Benang utama

  • Benang semasa tidak memulakan gelung acara

Memanggil kaedah asyncio.get_event_loop() akan menjana lalai baharu gelung acara dan tetapkannya Untuk gelung acara utas semasa.

Pada masa ini, get_event_loop() adalah bersamaan dengan:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

Atas ialah kandungan terperinci Bagaimana untuk menggunakan fungsi biasa asyncio 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