Rumah >pembangunan bahagian belakang >Tutorial Python >Membina Pelayan Soket Didorong Peristiwa dalam Python
Apabila anda membina aplikasi rangkaian, pengendalian berbilang sambungan pelanggan secara serentak ialah pertimbangan utama. Pelayan soket penyekat tradisional boleh bergelut dengan penskalaan, menjadikannya kurang sesuai untuk persekitaran yang memerlukan keselarasan tinggi. Dalam kes sedemikian, pelayan soket dipacu peristiwa boleh menawarkan penyelesaian yang lebih berskala dan cekap. Pendekatan ini membolehkan pelayan mengendalikan berbilang sambungan secara serentak tanpa menyekat, menjadikannya sesuai untuk aplikasi masa nyata berprestasi tinggi.
Dalam panduan komprehensif ini, kami akan membimbing anda melalui cara menulis pelayan soket dipacu peristiwa dalam Python menggunakan asyncio, perpustakaan terbina dalam untuk menulis program terikat I/O tak segerak. Kami akan merangkumi semua konsep langkah demi langkah, daripada menyediakan pelayan kepada mengendalikan sambungan pelanggan secara tidak segerak.
Menjelang akhir panduan ini, anda akan mempunyai pengetahuan untuk mencipta pelayan soket berskala yang boleh mengendalikan sejumlah besar sambungan pelanggan dengan cekap dan tanpa menyekat. Ini adalah kemahiran penting untuk pembangun yang ingin membina aplikasi rangkaian berprestasi tinggi dalam Python.
pelayan soket dipacu peristiwa ialah pelayan yang bertindak balas kepada acara, seperti permintaan rangkaian masuk, dengan memprosesnya secara tidak segerak. Daripada mempunyai blok pelayan dan menunggu setiap sambungan pelanggan diproses sepenuhnya (seperti yang berlaku dalam pelayan tradisional, segerak), pelayan dipacu peristiwa menggunakan panggilan tidak menyekat yang membolehkannya memproses berbilang permintaan sekaligus. Model ini sangat sesuai untuk pelayan yang perlu mengendalikan banyak sambungan secara serentak, seperti pelayan sembang, alatan kerjasama masa nyata atau API yang mengendalikan jumlah permintaan yang besar.
Model pengaturcaraan dipacu peristiwa membolehkan pelayan membuat skala dengan lebih berkesan daripada model segerak. Pendekatan tradisional selalunya melibatkan penyekatan operasi I/O, di mana pelayan menunggu satu permintaan untuk diproses sebelum ia boleh mengendalikan yang seterusnya. Dalam senario trafik tinggi, ini boleh menyebabkan kelewatan dan mengurangkan prestasi pelayan.
Dengan model dipacu peristiwa, pelayan tidak menunggu pelanggan selesai menghantar atau menerima data sebelum mengendalikan pelanggan lain. Sebaliknya, pelayan bertindak balas kepada peristiwa semasa ia berlaku, memastikan sumber digunakan dengan cekap dan pelayan boleh menguruskan banyak sambungan serentak. Pendekatan ini berfungsi terutamanya dalam situasi di mana kebanyakan kerja melibatkan menunggu I/O (cth., membaca daripada fail, menunggu respons rangkaian), dan bukannya tugasan terikat CPU.
Sebelum menyelami kod, adalah penting untuk memahami konsep dan alatan utama yang akan memudahkan pembinaan pelayan soket dipacu peristiwa.
Asas Python: Anda perlu mempunyai pemahaman yang baik tentang pengaturcaraan Python, terutamanya mengenai rangkaian dan pengaturcaraan soket. Khususnya, pengetahuan tentang cara menggunakan perpustakaan soket Python untuk mencipta soket pelayan dan pelanggan adalah penting.
Perpustakaan Asyncio: Pustaka asyncio Python membenarkan pengaturcaraan tak segerak dengan menyediakan sokongan untuk I/O yang tidak menyekat, gelung acara, coroutine dan tugasan. Memahami asas asyncio adalah penting kerana ia membentuk tulang belakang pelayan dipacu acara anda.
Konkurensi dan Konsep Asynchronous: Model dipacu peristiwa bergantung pada pengaturcaraan tak segerak, yang mungkin agak sukar untuk difahami pada mulanya. Kebiasaan dengan konsep seperti kata kunci coroutines, gelung acara dan menunggu/async akan membantu anda bekerja dengan berkesan dengan asyncio Python.
Untuk mula membina pelayan soket dipacu peristiwa dalam Python, pastikan anda mempunyai persekitaran Python yang berfungsi. Python 3.7 atau lebih tinggi disyorkan, kerana ia termasuk sokongan penuh untuk pengaturcaraan tak segerak melalui asyncio.
Jika anda tidak memasang Python, anda boleh memuat turun dan memasangnya dari tapak web rasmi: python.org.
Setelah Python dipasang, anda boleh mengesahkan pemasangan anda dengan menjalankan arahan berikut:
python --version
Kini anda sudah bersedia untuk mula membina pelayan soket anda.
Langkah pertama dalam menulis pelayan soket dipacu peristiwa ialah mencipta fungsi yang boleh mengendalikan sambungan klien. Fungsi ini akan dipanggil apabila sambungan baharu diwujudkan.
Dalam Python, fungsi asyncio.start_server digunakan untuk mencipta pelayan yang mendengar sambungan pelanggan masuk. Fungsi ini mengambil maklumat hos dan port, serta fungsi panggil balik yang akan dipanggil untuk setiap pelanggan yang menyambung.
Berikut ialah cara anda boleh menyediakan pelayan:
import asyncio async def handle_client(reader, writer): addr = writer.get_extra_info('peername') print(f"Connection from {addr}") data = await reader.read(100) message = data.decode() print(f"Received {message!r}") response = f"Hello, {message}" writer.write(response.encode()) await writer.drain() print(f"Sent: {response}") writer.close() await writer.wait_closed() async def start_server(): server = await asyncio.start_server( handle_client, '127.0.0.1', 8888 ) addr = server.sockets[0].getsockname() print(f"Serving on {addr}") async with server: await server.serve_forever() if __name__ == '__main__': asyncio.run(start_server())
Mari kita pecahkan komponen utama pelayan ini:
handle_client(pembaca, penulis): Fungsi ini dipanggil apabila pelanggan baharu menyambung. Pembaca digunakan untuk membaca data daripada klien, manakala penulis digunakan untuk menghantar semula data kepada klien. Kedua-dua pembaca dan penulis adalah strim asyncio yang membenarkan I/O tidak menyekat.
start_server(): Fungsi ini menyediakan pelayan menggunakan asyncio.start_server. Pelayan mendengar pada alamat IP 127.0.0.1 (localhost) dan port 8888.
tunggu asyncio.run(start_server()): Ini memulakan gelung acara asyncio dan mula menjalankan pelayan. Fungsi start_server ialah fungsi tak segerak yang akan berjalan selama-lamanya sehingga pelayan dihentikan secara manual (contohnya, dengan arahan Ctrl C).
Setelah pelanggan menyambung ke pelayan, data boleh dihantar dan diterima menggunakan objek pembaca dan penulis. Dalam contoh di atas, pelayan menerima sehingga 100 bait data daripada klien menggunakan pembaca await.read(100). Pelayan kemudian menghantar respons kepada pelanggan.
Arahan await writer.drain() memastikan pelayan menunggu sehingga data dihantar sepenuhnya sebelum menutup sambungan.
Kuasa sebenar asyncio datang daripada keupayaannya untuk mengendalikan banyak sambungan secara serentak tanpa menyekat. Apabila pelanggan baharu menyambung, coroutine handle_client dihasilkan dan sementara ia menunggu data tiba (melalui panggilan await reader.read()), ia membebaskan gelung acara untuk mengendalikan pelanggan lain.
I/O tidak menyekat ini adalah intipati model pengaturcaraan dipacu peristiwa: daripada menunggu satu permintaan selesai sebelum memproses yang seterusnya, pelayan boleh menguruskan banyak sambungan secara selari, meningkatkan kebolehskalaan dan prestasi dengan ketara.
Salah satu ciri utama pelayan dipacu acara ialah keupayaannya untuk ditutup dengan baik. Pelayan mesti mengendalikan pemutusan sambungan pelanggan dan memastikan sumber dibebaskan dengan betul. Ini biasanya dicapai dengan menutup penulis dengan writer.close() dan menunggu sambungan ditutup dengan wait writer.wait_closed().
Seperti mana-mana aplikasi rangkaian, pengendalian ralat yang mantap adalah penting. Sebagai contoh, anda mungkin menghadapi putus sambungan pelanggan, kegagalan rangkaian atau input data tidak sah. Mekanisme pengendalian ralat yang mudah boleh memastikan pelayan terus berjalan walaupun ralat berlaku. Anda boleh menggunakan blok try-except untuk mengendalikan pengecualian seperti tamat masa atau ralat sambungan.
python --version
Setelah pelayan anda berjalan, anda boleh mengujinya menggunakan pelbagai kaedah. Untuk memudahkan, salah satu cara paling mudah ialah menggunakan telnet. Anda boleh menjalankan arahan berikut dari baris arahan untuk membuka sambungan ke pelayan:
import asyncio async def handle_client(reader, writer): addr = writer.get_extra_info('peername') print(f"Connection from {addr}") data = await reader.read(100) message = data.decode() print(f"Received {message!r}") response = f"Hello, {message}" writer.write(response.encode()) await writer.drain() print(f"Sent: {response}") writer.close() await writer.wait_closed() async def start_server(): server = await asyncio.start_server( handle_client, '127.0.0.1', 8888 ) addr = server.sockets[0].getsockname() print(f"Serving on {addr}") async with server: await server.serve_forever() if __name__ == '__main__': asyncio.run(start_server())
Setelah disambungkan, anda boleh menaip sebarang mesej dan pelayan akan membalas dengan mesej ucapan.
Sebagai alternatif, anda boleh menulis klien Python untuk berinteraksi dengan pelayan. Ini melibatkan penggunaan asyncio.open_connection untuk mewujudkan sambungan ke pelayan, menghantar data dan membaca respons secara tidak segerak.
Membina pelayan soket dipacu peristiwa dalam Python ialah cara terbaik untuk mencipta aplikasi rangkaian berskala dan cekap. Dengan memanfaatkan kuasa asyncio dan model pengaturcaraan dipacu peristiwa, anda boleh mengurus berbilang sambungan pelanggan tanpa menyekat, menghasilkan prestasi dan responsif yang lebih baik.
Sama ada anda membina pelayan sembang ringkas, pelayan HTTP atau pengendali strim data masa nyata, model pelayan soket dipacu peristiwa ialah pendekatan serba boleh yang boleh membantu skala aplikasi anda dengan cekap. Dengan menggunakan contoh kod dan konsep yang digariskan dalam panduan ini, anda kini dilengkapi untuk membina pelayan berasaskan Python anda sendiri yang boleh mengendalikan tahap konkurensi yang tinggi.
Atas ialah kandungan terperinci Membina Pelayan Soket Didorong Peristiwa dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!