Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kemahiran pengaturcaraan pelayan Python: melaksanakan pengaturcaraan I/O tak segerak

Kemahiran pengaturcaraan pelayan Python: melaksanakan pengaturcaraan I/O tak segerak

王林
王林asal
2023-06-18 10:53:23817semak imbas

Sebagai bahasa pengaturcaraan yang ditafsirkan, Python mempunyai sokongan perpustakaan yang sangat berkuasa, termasuk pelbagai perpustakaan yang berkaitan dengan pengaturcaraan rangkaian. Dalam bidang pengaturcaraan pelayan dalam Python, pengaturcaraan I/O tak segerak adalah teknologi yang sangat penting. Artikel ini akan memperkenalkan pengaturcaraan I/O tak segerak, mengapa menggunakan I/O tak segerak adalah lebih cekap, dan memperkenalkan teknik untuk melaksanakan pengaturcaraan I/O tak segerak dalam Python.

Apakah pengaturcaraan I/O tak segerak?

Dalam pengaturcaraan I/O segerak tradisional, program biasanya menyekat untuk menunggu satu operasi selesai sebelum meneruskan ke operasi seterusnya. Disebabkan oleh kelajuan penghantaran rangkaian yang perlahan, penantian sedemikian akan menyebabkan kecekapan pelaksanaan program menjadi sangat rendah dan sumber komputer tidak dapat digunakan sepenuhnya.

Pengaturcaraan I/O tak segerak ialah kaedah pengaturcaraan yang tidak lagi menyekat dan menunggu Ia boleh terus melaksanakan kod berikutnya sementara menunggu operasi I/O selesai. Ini dicapai menggunakan mekanisme gelung peristiwa tak segerak dan operasi I/O tidak menyekat.

Melalui pengaturcaraan I/O tak segerak, berbilang operasi I/O (seperti membaca dan menulis fail, permintaan rangkaian, dll.) boleh dilaksanakan secara serentak dan menunggu semua operasi I/O selesai sebelum meneruskan ke langkah seterusnya. Ini membolehkan pemprosesan serentak yang cekap.

Mengapa menggunakan pengaturcaraan I/O tak segerak?

Pengaturcaraan I/O tak segerak mempunyai beberapa kelebihan yang sangat jelas berbanding pengaturcaraan I/O segerak:

  1. Kecekapan yang lebih tinggi: Pengaturcaraan I/O tak segerak boleh menggunakan sepenuhnya sumber komputer untuk menambah baik kecekapan pelaksanaan program. Ini kerana apabila operasi I/O sedang menunggu, anda boleh segera beralih kepada operasi lain dan bukannya menunggu untuk menyekat, sekali gus mengelakkan pembaziran masa menunggu.
  2. Skala yang lebih baik: Dalam pengaturcaraan I/O tak segerak, aplikasi boleh mengendalikan berbilang sambungan secara serentak tanpa menyekat atau meletihkan sumber benang. Ini menjadikan pengaturcaraan I/O tak segerak lebih mudah untuk menyokong sejumlah besar sambungan serentak.
  3. Responsif yang lebih baik: Pengaturcaraan I/O tak segerak boleh menjadikan program lebih fleksibel, bertindak balas kepada permintaan pengguna tepat pada masanya dan menyelesaikan operasi I/O dengan lebih pantas apabila mengendalikan sejumlah besar sambungan serentak.

Petua untuk melaksanakan pengaturcaraan I/O tak segerak

Dalam Python, melaksanakan pengaturcaraan I/O tak segerak memerlukan penggunaan perpustakaan yang berkaitan. Perpustakaan berikut biasanya digunakan perpustakaan I/O tak segerak dalam Python:

  1. asyncio: Pustaka I/O tak segerak dalam perpustakaan standard Python menyediakan sokongan I/O tak segerak peringkat sistem pengendalian dan boleh mengendalikan Asynchronous sambungan rangkaian dan IPC (komunikasi antara proses).
  2. Tornado: Rangka kerja web yang sangat berkuasa dan perpustakaan I/O tak segerak dengan pustaka rangkaian tak segerak berprestasi tinggi dan fungsi I/O tak segerak.
  3. gevent, dsb.: Selain pustaka I/O tak segerak dalam pustaka standard Python, terdapat beberapa perpustakaan pihak ketiga yang turut menyediakan sokongan I/O tak segerak yang sangat baik.

Seterusnya, kami akan mengambil perpustakaan asyncio sebagai contoh untuk memperkenalkan teknik pengaturcaraan I/O tak segerak dalam Python.

  1. Definisi Coroutine

Dalam pustaka asyncio, coroutine ialah unit asas pengaturcaraan tak segerak Ia adalah utas ringan yang boleh digunakan dalam berbilang coroutine serentak. Coroutine boleh dilihat sebagai fungsi yang boleh menjeda dan menyambung semula pelaksanaan. Ia boleh menggunakan pernyataan hasil untuk menjeda pelaksanaannya. Dalam Python 3.5 dan ke atas, kata kunci async/wait memudahkan untuk membuat dan mengurus coroutine.

Berikut ialah contoh coroutine mudah:

import asyncio

async def coroutine_demo():
    print("Start")
    await asyncio.sleep(1)
    print("End")

Kod di atas mentakrifkan coroutine bernama coroutine_demo, dan pernyataan tunggu digunakan dalam coroutine untuk menunjukkan bahawa coroutine sedang berjalan Pelaksanaan akan dijeda sementara menunggu operasi I/O tak segerak selesai. Fungsi tidur dalam perpustakaan asyncio digunakan di sini untuk mensimulasikan masa menunggu semasa operasi I/O.

  1. Gelung peristiwa

Gelung peristiwa dalam pustaka asyncio ialah teras operasi I/O tak segerak. Gelung peristiwa menggunakan gelung tak terhingga untuk mendengar peristiwa tak segerak Apabila peristiwa berlaku, ia boleh diproses dan dikembalikan serta-merta. Gelung peristiwa boleh difahami sebagai sistem mesej, di mana mesej adalah hasil daripada operasi I/O tak segerak.

Berikut ialah contoh gelung acara mudah:

import asyncio

async def coroutine_demo():
    print("Start")
    await asyncio.sleep(1)
    print("End")

loop = asyncio.get_event_loop()
loop.run_until_complete(coroutine_demo())
loop.close()

Dalam contoh ini, coroutine bernama coroutine_demo pertama kali ditakrifkan. Kemudian, gelung peristiwa dibuat dan coroutine_demo coroutine dijalankan menggunakan kaedah run_until_complete(). Selepas berjalan, coroutine akan mengeluarkan "Mula" pada baris pertama, dan kemudian tunggu selama 1 saat sebelum mengeluarkan "Tamat".

Perlu diingat bahawa gelung acara mesti dijalankan dalam urutan utama. Jika kita memanggil kaedah run_loop() dalam benang lain, program akan membuang pengecualian.

  1. Fungsi panggil balik

Dalam pengaturcaraan I/O tak segerak, apabila peristiwa tak segerak berlaku, gelung peristiwa akan memberitahu coroutine untuk melaksanakan fungsi panggil balik yang sepadan. Fungsi panggil balik ialah fungsi biasa yang digunakan untuk mengendalikan hasil operasi I/O tak segerak.

Berikut ialah contoh fungsi panggil balik ringkas:

import asyncio

async def coroutine_demo():
    print("Start")
    await asyncio.sleep(1)
    print("End")

def callback_func(future):
    print("Callback function")

loop = asyncio.get_event_loop()
future = asyncio.ensure_future(coroutine_demo())
future.add_done_callback(callback_func)
loop.run_until_complete(future)
loop.close()

Dalam contoh ini, fungsi callback_func ialah fungsi panggil balik yang dipanggil apabila coroutine telah selesai dijalankan.

  1. Operasi I/O tak segerak

Dalam pengaturcaraan I/O tak segerak, hampir semua operasi I/O perlu dirangkumkan ke dalam coroutine menggunakan kata kunci async/waiit . Sebagai contoh, anda boleh menggunakan fungsi terbuka dalam perpustakaan asyncio untuk membaca dan menulis fail secara tidak segerak:

import asyncio

async def read_file(path):
    async with aiohttp.ClientSession() as session:
    async with session.get(path) as response:
        return await response.text()

loop = asyncio.get_event_loop()
result = loop.run_until_complete(read_file("http://example.com"))
loop.close()

Dalam contoh ini, kami menggunakan objek ClientSession pustaka aiohttp untuk membuat permintaan HTTP tak segerak, dan selepas mendapat respons, gunakan kata kunci await untuk mendapatkan respons text() adalah kunci untuk membuat I/O tak segerak menunggu.

Ringkasan

Seperti yang dinyatakan di atas, pengaturcaraan I/O tak segerak ialah model pengaturcaraan yang cekap yang boleh meningkatkan kecekapan pelaksanaan dan responsif program. Bahasa Python mempunyai perpustakaan I/O tak segerak yang sangat kaya, termasuk perpustakaan asyncio pustaka standard Python dan perpustakaan pihak ketiga Tornado dan gevent. Mempelajari kemahiran pengaturcaraan I/O tak segerak sangat diperlukan untuk pengaturcara pelayan Python.

Atas ialah kandungan terperinci Kemahiran pengaturcaraan pelayan Python: melaksanakan pengaturcaraan I/O tak segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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