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