2013-06-04 27 views
5

經過一番努力,我設法建立了一個PHP多線程服務器,該服務器接收來自多個WebSocket的輸入並將其傳遞給單個TCP套接字。 我用pthreads實現了這一點,並設法將Stackable對象用作數組。Threads,Workers,Mutex,Stackable之間的區別?

下一步現在是真正瞭解我在做什麼和最肯定是我可以做的更好。我在這裏讀了一些關於多線程並不是你只是'做'的東西。出於這個原因,在繼續編碼之前,我想先深入研究。 帶我到這些問題:

什麼是A Worker Thread has a persistent statepthreads.org)。工作人員在超出範圍時會繼續運行嗎?他們與Stackables的關係是什麼?

PHP手冊說工作線程應該用於線程,爲什麼?

我希望我的問題不是很廣泛。

回答

13

工作者線程具有持久狀態:當你開始工作線程,工人可用於執行,直到變量超出範圍或工人處於停機狀態。

舉一個腳本示例,該腳本可以從多個來源聯機下載多個頁面:在很小的範圍內,您可能會擺脫困境,它可能是擁有多個線程的最佳設計,每個線程處理單個請求並處理內容。但是,通常情況下,開始一個線程發出一個請求或者執行任何非常簡單的操作,您應該認爲這是一項巨大的浪費,相反,您可以啓動儘可能多的工作人員,因爲您的硬件和環境可以管理,並實現請求和處理內容作爲一個Stackable。使用Worker時,每個請求不會花費您對線程上下文的初始化。在這種情況下的持久性是指每個Stackables可以讀取$ this-> worker,並訪問所有/任何全局(包括類級靜態變量)作用域,因此從Stackable的角度來看,在執行期間工人堅持,實際上Stackables只是共享一個上下文。

互斥和電導率是有鐵桿POSIX線程成癮者,以及並行線程本身的發展過程中我的目的。普通用戶不應該真的需要使用這個功能,儘管它與對應的posix函數一樣都有文檔記錄,並且大部分原始文檔仍然適用(頂層有一層明智的文檔)。 Mutex和Cond都是熟悉功能的精簡包裝,並不是真正針對Joe Bloggs。

我想如果互斥體,以便有安全的閱讀和對象的寫作需要你想知道,這是不是這樣,安全性被內置到並行線程。

你應該使用一個工作線程的時間將是;從這個例子來看,它的規模很小。此外,如果您有硬件來支持它,線程可以創建工人(和線程),這可以爲更復雜的系統設計提供可能性。在這種情況下,你也可能會變得很棒,在這種情況下,你可以將你的線程編程爲像工作人員一樣工作,而不需要爲每個任務開始對象初始化(堆棧)。 Worker是一個線程,只有Thread的某些功能被用來執行一個Stackables的列表,你會注意到Thread和Worker的同步方法的細微差別,如果你按照預期使用工作者,這並不重要。但是,如果您的真棒導致您認爲避免使用標準模型會更好,那麼您將需要來自Thread對象的同步來實現PHP中的Worker模式。

事實是,如果你正在尋找線程,你一次只想做兩到三件事情,那麼你很可能會找到辦法做一些事情。因此,提供Worker/Stackable功能作爲pthreads包的一部分是有意義的,因爲它更適合在不同的上下文中執行一堆事情,所以在PHP中編寫這些東西(即使在pthread的幫助下)也是非常棘手的。

+0

謝謝!這是一個巨大的幫助。儘管我的代碼正在工作,但我的方式並不順利。我仍然想知道什麼時候可以使用純色的Thread對象。 – marlonp33

+1

好的,我更新了線索上的一些關於...的信息,希望能夠完全回答你的問題。 –

+0

我不得不多次閱讀這些內容才能理解你的意思。但是謝謝! – Nerrve