stream_set_blocking讓程序無阻塞 0是非阻塞,1是阻塞 阻塞的意義是什么呢? 某個(gè)函數(shù)讀取一個(gè)網(wǎng)絡(luò)流,當(dāng)沒有未讀取字節(jié)的時(shí)候,程序該怎么辦? 是一直等待,直到下一個(gè)未讀取的字節(jié)的出現(xiàn),還是立即告訴調(diào)用者當(dāng)前沒有新內(nèi)容? 前者是阻塞的,后者是非阻塞的。 阻塞的好處是,排除其它非正常因素,阻塞的是按順序執(zhí)行的同步的讀取。 借用小說里的說法就是“神刀出鞘,無血不歸”。在讀到新內(nèi)容之前,它不會(huì)往下走,什么別的事情都不做。 而非阻塞,因?yàn)椴槐氐却齼?nèi)容,所以能異步的執(zhí)行,現(xiàn)在讀到讀不到都沒關(guān)系,執(zhí)行讀取操作后立刻就繼續(xù)往下做別的事情。 如果你不放心,可以過一定的時(shí)間再來檢查執(zhí)行的結(jié)果。之前我寫過一個(gè)用popen pclose來讓程序并發(fā)執(zhí)行的例子。 當(dāng)時(shí)的遺憾就是調(diào)用之后不管,所以沒法知道程序是否執(zhí)行成功了?,F(xiàn)在popen之后設(shè)定為非阻塞模式,就可以創(chuàng)建一個(gè)數(shù)組作為任務(wù)池。 狀態(tài)值$status['eof']為真,就表示那個(gè)任務(wù)執(zhí)行完畢了。我本次實(shí)現(xiàn)的程序功能比較單一,只需要知道它執(zhí)行完畢就可以了。如果你的任務(wù)有多種 結(jié)果,那就繼續(xù)分析讀取到的內(nèi)容吧。發(fā)現(xiàn)有任務(wù)執(zhí)行完畢,從任務(wù)池中剔除該任務(wù),如果任務(wù)隊(duì)列中還有未做的任務(wù),就把新任務(wù)從隊(duì)列中移到任務(wù)池中執(zhí)行。 說的比較啰嗦,如果你用過網(wǎng)絡(luò)螞蟻或網(wǎng)際快車之類的下載軟件,你會(huì)發(fā)現(xiàn)我講的這些其實(shí)就是它們的工作原理。 ps:多進(jìn)程異步抓取很爽啊。 |
|