python 网络编程_Python网络编程(六)
回顧
在《Python進階記錄之網絡編程(五)》中,我們介紹了如何利用TCP服務端和客戶端實現一個簡單的點對點聊天,區別基于TCP協議和UDP協議的不同之處。今天我們講一下如何利用多進程和多線程的知識來創建多進程服務端和多線程服務端。
單進程堵塞服務端
不論是基于TCP協議還是UDP協議,我們之前創建的服務端程序都是單進程堵塞式的服務端,具體表現為同一時刻只能接收一個客戶端連接,當有客戶端連接時,此時服務端無法再接收其他客戶端的連接請求。
我們以基于TCP協議的服務端程序為例,創建一個TCP服務端。代碼與我們之前介紹的基本一致,具體如下。
TCP服務端程序
創建好TCP服務端程序后,我們利用sokit網絡通信調試助手打開兩個客戶端,IP設置為本機IP,端口號與服務端程序綁定的端口號保持一致,為“6666”。
設置兩個客戶端
現在我們運行剛剛創建好的TCP服務端,然后將sokit設置的兩個客戶端都點擊TCP Connect按鈕,進行連接嘗試。
單進程堵塞式服務端接受連接
可以看到,單進程堵塞式的服務端只能同時接受一個客戶端的連接請求,一旦有一個客戶端成功連接后,服務端就堵塞了,此時其他客戶端無法再成功連接。只有當前客戶端關閉連接,服務端才能重新接受其他客戶端的連接。
多進程服務端
單進程堵塞式的服務端由于在處理連接的過程中,無法接受其他客戶端的連接,因此只能同時接受一個客戶端的連接請求。我們可以利用多進程的知識點為每個連接都創建新的進程,這樣,服務端就擁有同時處理客戶端連接的能力了。
我們將處理連接的代碼單獨提取處理,包裝成函數,然后使用Python的multiprocessing模塊來創建進程。為了防止端口被占用,我們綁定新的端口“12345”。
多進程TCP服務端程序
在創建進程時,Python會向子進程中copy一份當前連接的客戶端套接字,因此我們可以在父進程中關閉該套接字。
我們運行該多進程TCP服務端程序,并仍然利用sokit設置的兩個客戶端,將Port修改為服務端綁定的端口“12345”,點擊TCP Connect按鈕,進行連接嘗試。
多進程服務端接受連接
可以看到,與單進程堵塞時服務端不同的是,多進程服務端程序可以同時接受多個客戶端的連接,并且相互之前不受影響。
多線程服務端
通過為每個客戶端創建一個進程的方式,我們成功讓服務端程序能夠同時為多個客戶端進行服務。但是,我們在介紹多進程知識點的時候提到過,如果創建的進程過多,例如這里我們如果有成千上萬個客戶端要連接時,那么創建那么多進程需要耗費較大的資源。
除了多進程,我們還可以使用多線程,只要為每個連接開辟一個新線程進行處理,也能夠讓服務端程序同時為多個客戶端進行服務。
我們仍然將處理連接的代碼單獨提取處理,包裝成函數,然后使用Python的threading模塊來創建子線程。
多線程TCP服務端程序
代碼基本與多進程服務端程序相同,不同的是一個創建進程,一個創建線程。此外,我們在介紹線程的相關知識點時提到過,線程間是會共享變量的,因此,我們不能像多進程服務端那樣在父進程中關閉當前連接客戶端的套接字。
同樣地,多線程服務端程序可以同時接受多個客戶端的連接,并且相互之前不受影響。
總結
以上內容介紹了如何利用多進程和多線程的知識來創建多進程服務端和多線程服務端,需要重點掌握多進程服務端和多線程服務端程序的寫法,理解引入多進程和多線程的原因。感謝大家的支持與關注,歡迎一起學習交流~
總結
以上是生活随笔為你收集整理的python 网络编程_Python网络编程(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rpm部署mysql_使用rpm快速安装
- 下一篇: MySQL怎么存base64编码_MyS