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:
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:
Seterusnya, kami akan mengambil perpustakaan asyncio sebagai contoh untuk memperkenalkan teknik pengaturcaraan I/O tak segerak dalam Python.
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.
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.
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.
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!