Python 多工網路程式設計

2021-09-05 12:25:21 字數 1099 閱讀 1561

提高效能的多工程式設計

可以用單執行緒-單程序-非堵塞併發的方法來實現多工,

socket.setblocking(false) # 將套接字變為非堵塞,會讓accept在沒有客戶端到來之前和socket.recv()沒有收到資料的時候從堵塞變為異常,從而我們可以讓它丟擲異常,繼續執行下面的**。

我們可以新建乙個列表,當有客戶端連線時,把accept返回的套接字新增到這個列表裡面,然後遍歷列表,檢視每個套接字是否收到了資料,沒有收到丟擲異常,繼續執行**,從而可以以併發的方式實現單執行緒單程序完成同時對多個客戶端的服務。

當列表裡的元素越來越多時,這種方法(輪詢)的效率會大大降低,所以引入了epoll ,用事件通知的方式來監聽列表裡的套接字

select輪詢

for迴圈套接字列表,實際上是把每乙個套接字物件的描述符拷貝到記憶體中,然後檢視是否接收到了資料,所以效率比較慢

epoll的實現原理

epoll採用了記憶體對映技術,它會在記憶體中單獨開闢出乙個供系統和程序共用的乙個空間,然後將對應的檔案描述符註冊到這個記憶體當中,當其中基於某個檔案描述符讀就緒時,通過基於事件的就緒通知方式,來啟用對應的檔案描述符

用epoll的方法就不用講套接字設定成非堵塞模式了,因為poll()會預設堵塞,只有當有新客戶端到來或者是有事件通知時,才會解堵塞

i/o多路復用:遇到i/o操作會自動執行其他**

通過一種機制使單程序實現同時等待多個檔案描述符,當其中任意乙個描述符就緒時,epoll()函式就會返回。所以i/o復用本質上不是併發,因為任何時候都是單程序單執行緒處理,之所以能夠提高效率,是因為select/epoll可以同時監測所有進來的socket,一旦有socket有資料讀寫,就會立刻返回給程序處理(是基於事件就緒通知的方式而不是輪詢)

如何更好地實現高效能併發

可以使用多執行緒/多程序和i/o復用的方式混合,i/o負責提高監測socket通知效率,收到請求後返回給程序池/執行緒池來執行邏輯**

使用gevent來實現http伺服器多工時,不用使用joinall,遇到堵塞會自動執行

多工網路程式設計

1 include 2 include 3 include 4 include 5 include in.h 6 include 7 include link.h 8 9 define port 8888 10int main void 11 31 sin.sin family af inet fi...

python 多工程式設計

多工 在同一時間內執行多個任務 多工的目的 多工的最大好處是充分利用cpu資源,提高程式的執行效率 併發 在一段時間內交替執行多個任務 並行 在同一時刻同時執行多個任務 程序 執行中的程式,分配資源的最小單位 執行緒 使用資源的最小單位 程序和執行緒的關係 乙個程式執行後至少有乙個程序,每個程序預設...

python 多工程式設計 程序

程序 想要實現多工可以使用程序來完成,概念 乙個正在執行的程式或者軟體就是乙個程序,它是作業系統進行資源發呢排的基本單位 乙個程式執行後至少有乙個程序,乙個程序預設有乙個執行緒,程序裡面可以建立多個執行緒,執行緒依附在程序裡面的,沒有程序就沒有執行緒。程序的使用 1 匯入程序包 import mul...