python socket 接收數(shù)據(jù)阻塞 tcp套接字函數(shù)中不會產(chǎn)生阻塞?
tcp套接字函數(shù)中不會產(chǎn)生阻塞?簡單,服務(wù)器端啟動進程,內(nèi)部函數(shù)Socket創(chuàng)建一個設(shè)計和實現(xiàn)TCP協(xié)議的流套接字描述符。其次,服務(wù)進程動態(tài)創(chuàng)建bind其它名字套接字,將套接字描述符帳號綁定到本地地址
tcp套接字函數(shù)中不會產(chǎn)生阻塞?
簡單,服務(wù)器端啟動進程,內(nèi)部函數(shù)Socket創(chuàng)建一個設(shè)計和實現(xiàn)TCP協(xié)議的流套接字描述符。其次,服務(wù)進程動態(tài)創(chuàng)建bind其它名字套接字,將套接字描述符帳號綁定到本地地址和本地端口上。又一次,服務(wù)器端內(nèi)部函數(shù)listen,又開始偵聽客戶端的Socket連接到請求。這一次阻塞,等到發(fā)來了客戶端的connect請求,內(nèi)部函數(shù)accept參與或則。但,不阻塞住bind和listen。
socket netty區(qū)別?
Socket那是為網(wǎng)絡(luò)服務(wù)提供給的一種機制。
通訊機的兩端也有Sokcet。網(wǎng)絡(luò)通訊其實那是Sokcet間的通訊,數(shù)據(jù)在兩個Sokcet間實際IO傳輸
Netty是一個基于條件JAVANIO類庫的異步模式通信框架,它的架構(gòu)特點是:異步運行非阻塞、實現(xiàn)事件驅(qū)動、集高性能、高可靠性和高可訂制性
在非阻塞模式上怎么知道recv接收數(shù)據(jù)完成?
以linux下tcpsocket編程為例:阻塞就是recv/read的時候socket收不到緩沖區(qū)如果這樣有數(shù)據(jù)就讀,沒數(shù)據(jù)我就總是睡覺時候死賴著不走,直到此時有數(shù)據(jù)跑來讀完我才走。
expect/write的時候,就算發(fā)送緩沖區(qū)滿了,沒有空間再繼續(xù)發(fā)送中了我也始終晚上睡覺賴著不肯走,等到郵箱里緩沖區(qū)騰出足夠的空間讓我把數(shù)據(jù)徹底塞到郵箱里緩沖區(qū)里我才走。
(當(dāng)然如果你按照setsockopt設(shè)置里了讀寫已超時,連接超時時間到了肯定會回-1和EAGAIN,并沒有睡覺時候等待)
非阻塞那是recv/read的時候,如果這樣接收緩沖區(qū)有數(shù)據(jù)我就繼續(xù)讀,沒有數(shù)據(jù)我真接帶了前往的-1和EGAIN走人,絕不會睡耐心的等待誤了時間。
write/send的時候,假如你的郵箱緩沖區(qū)有足夠的空間,就當(dāng)即把數(shù)據(jù)塞到郵箱里緩沖區(qū)去,接著轉(zhuǎn)身走人,如果不是正在發(fā)送緩存區(qū)滿了,空間將近,那直接跟著趕往的-1和EAGAIN走人。不過IO多路復(fù)用,簡單要再理解的是,操作系統(tǒng)為我能提供了一個功能,當(dāng)你的某個socket收得到緩存區(qū)有數(shù)據(jù)可讀,的或發(fā)送中緩沖區(qū)有空間可寫的時候,它也可以給你一個通知。
那樣的話當(dāng)配合非阻塞的socket使用時,唯有當(dāng)系統(tǒng)通知我哪個描述符可讀了,我才去先執(zhí)行read操作,可以絕對的保證每次read都能讀到最有效數(shù)據(jù)而不做純直接返回-1和EAGAIN的無用功。
寫操作相似。
操作系統(tǒng)的這個功能通過select/poll/epoll之類的系統(tǒng)調(diào)用函數(shù)來使用,這些函數(shù)都這個可以而監(jiān)視多個請看符的讀寫準備完成狀況,這樣,多個請看符的I/O操作都能在一個線程內(nèi)完成,這就叫I/O多路復(fù)用,這里的“復(fù)用”指的是復(fù)用同一個線程。再說事件驅(qū)動,其實是I/O多路復(fù)用的一個另外的稱呼。再說異步同步,我們最常見的linux下的網(wǎng)絡(luò)編程模型大部分全是離線io,以讀操作為例,本質(zhì)上也是必須用戶全局函數(shù)read/recv去從內(nèi)核緩沖區(qū)把數(shù)據(jù)繼續(xù)讀再處理業(yè)務(wù)邏輯。
同步異步io則是內(nèi)核已經(jīng)把數(shù)據(jù)讀行了,用戶再處理邏輯。
異步運行IO在linux下一般是用aio庫。