最近在看unix網(wǎng)絡(luò)編程,發(fā)現(xiàn)有多種IO模型,workerman使用的是多路復(fù)用IO模型,該模型阻塞在select,poll調(diào)用上,但是可以接收多個(gè)套接字,實(shí)際的IO操作是阻塞的,stream_set_blocking設(shè)置非阻塞好像沒有什么作用,因?yàn)槎嗦窂?fù)用模型是在套接字可讀寫的時(shí)候才進(jìn)行讀寫操作。不知以上理解是否正確?
“實(shí)際的IO操作是阻塞的,stream_set_blocking設(shè)置非阻塞好像沒有什么作用”
我感覺這個(gè)說得不對(duì),實(shí)際操作是非阻塞的,stream_set_blocking設(shè)置非阻塞也有用,比如fread阻塞調(diào)用沒數(shù)據(jù)或者數(shù)據(jù)不夠會(huì)一直阻塞在fread,那其他socket就沒機(jī)會(huì)調(diào)用fread了。非阻塞掉用沒數(shù)據(jù)或者數(shù)據(jù)不夠會(huì)立刻返回,這樣不影響其它socket讀數(shù)據(jù)
一般咱們看見的入門示例都是簡(jiǎn)單的bind listen accept read四步曲,其中沒有使用IO多路復(fù)用,stream_set_blocking設(shè)置為非阻塞以后,工作起來確實(shí)如你所言,fread非阻塞效果顯而易見,但問題關(guān)鍵就在于使用了IO多路復(fù)用,比如讀事件:當(dāng)檢測(cè)到socket可讀條件就緒的時(shí)候,就意味著數(shù)據(jù)已經(jīng)準(zhǔn)備好了可以讀了,所以此時(shí)觸發(fā)fread肯定是不會(huì)阻塞的,既然如此,這種上下文環(huán)境下的stream_set_blocking()無論是設(shè)置阻塞或非阻塞標(biāo)記位與否似乎都沒什么意義,所以猜題主的疑惑點(diǎn)應(yīng)該是在這里,我也有這樣的疑惑。
不啊,調(diào)用read后是否導(dǎo)致進(jìn)程阻塞還是取決于stream_set_blocking的設(shè)置的,這點(diǎn)是確定的。