python iocp 聊聊IOCP,聊聊非同步程式設計

2021-10-11 21:59:10 字數 980 閱讀 7561

前言

io完成埠(io completion ports)在多核計算機的並行非同步io請求方面提供了一種高效的執行緒模型。當程序建立乙個io完成埠時,系統建立乙個相關聯的佇列,其唯一目的是服務與那些請求。io完成埠通常和預先分配的執行緒池配合,相比於乙個乙個建立執行緒,這使其更快更高效。iocp在程序之間並不共享,乙個iocp及其控制代碼只和建立它的程序關聯,但是乙個程序中的多個執行緒可共享。iocp最關鍵的地方就是,iocp在io請求和接收動作完成之後,啟用執行緒池中的任意執行緒繼續操作,而不是在io請求和接受完成之後,啟用原等待中的執行緒。這樣的好處是防止等待執行緒閒置,和必須啟用/切換到原等待執行緒的開銷。

大多應用存在的問題

windows下使用iocp

非同步io在於執行緒非阻塞,提高cpu利用率,增加伺服器吞吐量,助我們承受更大的併發。在windows下使用iocp,可以直接使用c#非同步程式設計await/async。雖然c#可以直接操作win32api,但.net平台已提供好非同步io的操作封裝,只需要簡單的語法,即可完成非同步磁碟io,非同步http請求,非同步socket,基於.net框架現有的條件,也很容易做關聯式資料庫,redis,elasticsearch,mongodb的非同步讀寫。所以推薦在windows下的io盡可能使用iocp。iocp本質上解決的問題就是cpu和io速度極大的不對等。

基於iocp的非同步程式設計執行緒行為證明

簡單寫了個api介面,用於證明在非同步io操作的時候,執行緒並不阻塞等待io結束,而是將請求交給驅動後返回執行緒池,繼續工作。

圖中**操作是先記錄當前請求處理中的執行緒id,然後請求乙個10s返回的網路介面。用http客戶端併發請求圖中該介面後,我們稍後給出執行緒行為的結論。 我們都知道,如果說服務端執行緒是io阻塞的,第一次請求,如果記錄了執行緒id為1,那麼在10s內,該執行緒一直在阻塞等待,所以10s內不會再出現該執行緒id被記錄到日誌中。 事實上結論是:

可以看到在同一秒甚至同一毫秒內,乙個執行緒同時處理了多次http請求。另外可以確定的乙個事實是,io前和io後,執行緒可能是不一樣的,也可能是一樣的。

聊聊Spring中的IOC操作

什麼是ioc?ioc是指把物件的建立交給spring來管理的方式。它有兩種方式 一種是配置檔案 另一種是註解。ioc的實現主要依賴於下面四種技術 1 xml配置檔案 2 dom4j解析xml 3 工廠設計模式 4 反射 下面講解一下ioc的演變過程。現在有乙個類及類方法 public class u...

聊聊IOCP,聊聊非同步程式設計

io完成埠 io completion ports 在多核計算機的並行非同步io請求方面提供了一種高效的執行緒模型。當程序建立乙個io完成埠時,系統建立乙個相關聯的佇列,其唯一目的是服務與那些請求。io完成埠通常和預先分配的執行緒池配合,相比於乙個乙個建立執行緒,這使其更快更高效。iocp在程序之間...

聊聊 聊天工具

公司搬家後,對網路的限制越來越嚴格,只允許訪問網頁,主流的聊天工具msn,qq都在禁止之列,雖然一片 聲,卻無濟於事。還好還有google的gtalk,在公司的網路高壓政策下還有一條出路,只是gtalk的朋友比較少,大部分客戶都在qq,msn上,客戶紛紛打 來問怎麼不上網了?真不知如何給客戶解釋公司...