stream set blocking讓程式無阻塞

2021-06-23 02:52:16 字數 831 閱讀 2371

stream_set_blocking讓程式無阻塞

2009-10-21 10:10:04 

stream_set_blocking ($resource, $flag); $flag 取值為0或1

0是非阻塞,1是阻塞

阻塞的意義是什麼呢?

某個函式讀取乙個網路流,當沒有未讀取位元組的時候,程式該怎麼辦?

是一直等待,直到下乙個未讀取的位元組的出現,還是立即告訴呼叫者當前沒有新內容?

前者是阻塞的,後者是非阻塞的。

阻塞的好處是,排除其它非正常因素,阻塞的是按順序執行的同步的讀取。

借用**裡的說法就是「神刀出鞘,無血不歸」。在讀到新內容之前,它不會往下走,什麼別的事情都不做。

而非阻塞,因為不必等待內容,所以能非同步的執行,現在讀到讀不到都沒關係,執行讀取操作後立刻就繼續往下做別的事情。

如果你不放心,可以過一定的時間再來檢查執行的結果。之前我寫過乙個用popen pclose來讓程式併發執行的例子。

當時的遺憾就是呼叫之後不管,所以沒法知道程式是否執行成功了。現在popen之後設定為非阻塞模式,就可以建立乙個陣列作為任務池。

使用乙個while(1)的「死迴圈」來檢查當前任務池中各個任務的狀態,有老任務執行完畢時,$status = stream_get_meta_data($resource);

狀態值$status['eof']為真,就表示那個任務執行完畢了。我本次實現的程式功能比較單一,只需要知道它執行完畢就可以了。如果你的任務有多種 結果,那就繼續分析讀取到的內容吧。發現有任務執行完畢,從任務池中剔除該任務,如果任務佇列中還有未做的任務,就把新任務從佇列中移到任務池中執行。

ps:多程序非同步抓取很爽啊。

讓EXE檔案暢行無阻

遇到了乙個十分棘手的問題,就是進入windows 2000後所有擴充套件名為exe的檔案都不能執行了。現將發現和解決這一問題的過程及體會寫成下文,希望在今後碰到類似問題時會對大家有所幫助。故障現象 一日,開機後進入windows 2000,突然彈出了乙個對話方塊,標題為 c program file...

尤利克對講機 讓溝通無阻礙

無線對講機作為無線通訊裝置的一員,從出現至今沒有被現在通訊裝置擊敗,反而在越來越多場合得到更多使用,甚至在某些方面,如安保 勘探 物業等行業,其起到的作用是其他通訊裝置不可替代的。但對於整體的通話質量和效果提出了更高的要求,joqpfd而尤利克作為專業對講機品牌,在產品的質量和效能方面大下功夫,致力...

讓程式支援UNICODE

nt系統的核心是unicode 通常vc分建立的工程預設都是ansi 可以相容win9x 在nt下ansi程式在呼叫windows api的時系統實際又進行了一次ansi到unicode的 轉化,如movewindowa實際上又呼叫movewindoww.如果以我們的程式不考慮win9x 早晚是明日...