Berbagi teknologi

Apa itu coroutine di Python dan bagaimana mengimplementasikan pemrograman asinkron dengan Python

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

coroutine

Coroutine adalah komponen program yang memungkinkan beberapa titik masuk ke suatu program untuk menunda dan melanjutkan eksekusi di lokasi tertentu. Tidak seperti thread dan proses, peralihan coroutine dikontrol secara eksplisit oleh pemrogram, bukan dijadwalkan oleh sistem operasi. Hal ini membuat coroutine lebih ringan saat melakukan peralihan konteks, karena tidak perlu menyimpan dan memulihkan seluruh lingkungan eksekusi (seperti tumpukan thread).

Di Python, sebagian besar coroutine lolosasyncDanawait Kata kunci yang ingin dicapai. Fungsi yang didefinisikan menggunakan kata kunci ini disebut "fungsi coroutine" dan fungsi tersebut tidak langsung dijalankan saat dipanggil, melainkan mengembalikan objek coroutine. Objek coroutine ini perlu dijadwalkan untuk dieksekusi di loop peristiwa.

Pemrograman Asinkron

Pemrograman asinkron adalah model konkurensi yang memungkinkan program untuk terus melakukan tugas lain sambil menunggu operasi tertentu yang berjalan lama (seperti operasi I/O) selesai. Di Python, pemrograman asinkron sering digunakan dengan coroutine, yang eksekusinya dijadwalkan melalui loop peristiwa.

Bagaimana mengimplementasikan pemrograman asinkron dengan Python

1. GunakanasyncDanawait
  • Tentukan fungsi coroutine:menggunakanasync defuntuk mendefinisikan fungsi coroutine.
  • Tunggu coroutine: Di dalam fungsi coroutine, Anda dapat menggunakanawaituntuk menunggu operasi coroutine atau asinkron lainnya selesai.
2. Gunakan perulangan acara
  • ular pitonasyncio Perpustakaan menyediakan implementasi event loop. Anda perlu memastikan kode asinkron Anda berjalan di beberapa event loop.
  • menggunakanasyncio.run(main())untuk menjalankan fungsi coroutine utama Anda, yang secara otomatis membuat dan mengelola loop peristiwa.
3. Contoh kode
 

python复制代码

import asyncio
# 定义一个异步函数,模拟一个耗时的I/O操作
async def fetch_data(url):
print(f"Fetching {url}...")
# 模拟耗时操作
await asyncio.sleep(1)
return f"Data from {url}"
async def main():
# 同时启动多个异步任务
task1 = asyncio.create_task(fetch_data('http://example.com/data1'))
task2 = asyncio.create_task(fetch_data('http://example.com/data2'))
# 等待所有任务完成
result1, result2 = await asyncio.gather(task1, task2)
print(result1)
print(result2)
# 运行主协程
asyncio.run(main())

Dalam contoh ini,fetch_dataMerupakan fungsi asinkron yang mensimulasikan permintaan jaringan.mainDalam fungsinya, kami memulai dua sekaligusfetch_datatugas dan penggunaan yang tidak sinkronawait asyncio.gather()Tunggu sampai mereka selesai pada waktu yang sama.

4. Tindakan Pencegahan
  • Pemrograman asinkron dan coroutine mempermudah penanganan konkurensi, namun juga memperkenalkan kompleksitas baru seperti manajemen konteks asinkron, penanganan kesalahan, dll.
  • Saat merancang kode asinkron, berikan perhatian khusus pada operasi mana yang diblokir (misalnya, operasi I/O sinkron), dan gunakan versi pustaka dan API asinkron bila memungkinkan.
  • asyncio Ini adalah bagian dari perpustakaan standar Python dan digunakan untuk mendukung coroutine dan pemrograman asinkron.Ini juga menyediakan API yang kaya sepertiasyncio.Queueasyncio.Lockdll., untuk menangani masalah konkurensi dan sinkronisasi dalam kode asinkron.