2013-06-04 1 views
5

Dopo qualche sforzo, sono riuscito a configurare un server PHP multithread che riceve input da più WebSocket e lo passa su un singolo socket TCP. Ho raggiunto questo obiettivo con pthreads e sono riuscito a utilizzare l'oggetto Stackable come array.differenza tra Fili, Lavoratori, Mutex, Impilabile?

Il passo successivo ora è capire veramente quello che sto facendo e sicuramente quello che posso fare meglio. Ho letto da qualche parte qui su SO che il multithreading non è qualcosa che devi solo "fare". Per questo motivo mi piace scavare più a fondo prima di passare alla codifica. Mi porta a queste domande:

Cosa si intende per A Worker Thread has a persistent state (pthreads.org). Un lavoratore continuerà a correre fuori dal campo di applicazione? Qual è la loro relazione con Stackables?

Il manuale PHP dice che i thread di lavoro dovrebbero essere usati su Threads, perché?

Spero che la mia domanda non sia ampia.

risposta

13

Un thread di lavoro ha uno stato permanente: quando si avvia un thread di lavoro, il worker è disponibile per l'esecuzione fino a quando la variabile non viene portata fuori campo o il worker viene arrestato.

Prendi l'esempio di uno script che scarica più pagine da più fonti online: su scala ridotta, potresti farla franca, e potrebbe essere il miglior progetto avere più thread, ogni thread che riguarda una singola richiesta e elaborare il contenuto. Tuttavia, normalmente, dovresti considerare un enorme spreco iniziare una discussione per fare una singola richiesta, o eseguire qualcosa di molto semplice, invece tu avvii tutti i lavoratori che l'hardware e l'ambiente possono gestire e attui la richiesta e l'elaborazione dei contenuti come impilabile. Quando si usano i lavoratori, ogni richiesta non ti costa l'inizializzazione di un contesto di threading. La persistenza in questo contesto si riferisce al fatto che ciascuno degli Stackable può leggere $ this-> worker e accedere a tutti/nessuno degli ambiti globali (compresi gli oggetti variabili a livello di classe), quindi dal punto di vista dell'impilabile durante l'esecuzione il contesto di il lavoratore persiste, in realtà gli Stackable stanno semplicemente condividendo un contesto.

Mutex e Cond sono lì per i tossicodipendenti di threading posix hardcore e per i miei scopi durante lo sviluppo di pthreads. Gli utenti normali non dovrebbero davvero usare questa funzionalità, sebbene sia ben documentata come le funzioni di controparte posix, e gran parte della documentazione originale si applica ancora (con uno strato di sensibile in alto). Mutex e Cond sono entrambi involucri sottili attorno a funzionalità familiari, e non proprio mirati a Joe Bloggs.

Immagino che ti stia chiedendo se sono necessari mutex per poter leggere e scrivere oggetti in sicurezza, non è così, la sicurezza è incorporata in pthreads.

Le volte che dovresti usare una discussione su un lavoratore sarebbe; dall'esempio, su piccola scala. Inoltre, se l'hardware lo supporta, Threads può creare Worker (e Thread), che si prestano a possibilità di progettazione di sistemi più complessi. Potresti anche essere fantastico in questo, in questo caso puoi programmare i tuoi thread in modo che agiscano come lavoratori senza il sovraccarico dell'inizializzazione dell'oggetto (stackable) per ogni attività. A Worker è un thread, solo alcune delle funzionalità di Thread sono state aggiunte per eseguire un elenco di Stackable, si noteranno sottili differenze nei metodi di sincronizzazione di Thread e Worker, che non importa se si stanno utilizzando lavoratori come previsto . Se tuttavia la tua allegria ti porta a pensare che sarebbe meglio evitare il modello standard, allora avrai bisogno della sincronizzazione da un oggetto Thread per implementare un pattern Worker in PHP.

Il fatto è che, se si sta guardando il threading, si desidera eseguire più di 2 o 3 elementi alla volta, è probabile che si siano trovati modi per fare alcune cose. Quindi, fornire funzionalità Worker/Stackable come parte del pacchetto pthreads ha senso, perché è più adatto all'esecuzione di un sacco di cose in contesti separati, scrivere questa roba in PHP (anche con l'aiuto di pthreads) sarebbe complicato.

+0

Grazie! questo è un grande aiuto. Mentre il mio codice funzionava, ero fuori strada. Mi sto ancora chiedendo quando useresti l'oggetto Thread normale. – marlonp33

+1

Ok, ho aggiornato la risposta con alcune informazioni sul thread ... speriamo che risponda pienamente alla tua domanda. –

+0

ho dovuto leggerlo più volte per capire cosa stai dicendo. ma grazie! – Nerrve