2013-06-04 9 views
5

Nach einiger Anstrengung gelang es mir, einen PHP-Multithread-Server einzurichten, der Eingaben von mehreren WebSockets erhält und an einen einzelnen TCP-Socket weiterleitet. Ich habe dies mit Pthreads erreicht und es geschafft, das Stackable-Objekt als Array zu verwenden.Unterschied zwischen Threads, Arbeiter, Mutex, stapelbar?

Der nächste Schritt ist jetzt, wirklich zu verstehen, was ich tue und auf jeden Fall, was ich besser machen kann. Ich habe irgendwo hier auf SO gelesen, dass Multithreading nicht etwas ist, was man einfach "macht". Aus diesem Grund mag ich es zuerst tiefer zu graben, bevor ich mit der Codierung fortfahre. Bringt mich zu diesen Fragen:

Was bedeutet A Worker Thread has a persistent state (pthreads.org). Wird ein Arbeiter weiterlaufen, wenn er nicht mehr im Einsatz ist? Was ist ihre Beziehung zu Stackables?

Das PHP-Handbuch sagt Worker-Threads sollten über Threads verwendet werden, warum?

Ich hoffe meine Frage ist nicht zu breit.

Antwort

13

Ein Worker-Thread hat einen dauerhaften Status: Wenn Sie einen Worker-Thread starten, kann der Worker ausgeführt werden, bis die Variable den Bereich verlässt oder der Worker heruntergefahren wird.

Nehmen Sie das Beispiel eines Skripts, das mehrere Seiten aus mehreren Quellen online herunterlädt: in einem winzigen Maßstab könnten Sie damit durchkommen, und es könnte das beste Design sein, mehrere Threads zu haben, wobei jeder Thread eine einzige Anfrage bearbeitet Verarbeitung des Inhalts Normalerweise sollten Sie es jedoch als große Verschwendung betrachten, einen Thread zu starten, um eine einzelne Anfrage zu erstellen oder etwas sehr einfaches auszuführen, stattdessen würden Sie so viele Mitarbeiter starten, wie Ihre Hardware und Umgebung verwalten kann, und die Anfrage und Verarbeitung von Inhalten implementieren als stapelbar. Wenn Sie Workers verwenden, kostet jede Anforderung nicht die Initialisierung eines Threading-Kontextes. Persistenz bezieht sich in diesem Zusammenhang auf die Tatsache, dass jedes der Stackables $ this-> worker lesen kann und auf alle/alle der globalen (einschließlich der Klassen static Variablen) Bereiche zugreifen kann, also aus der Perspektive des Stackable während der Ausführung den Kontext von der Worker besteht fort, in Wirklichkeit teilen die Stackables einfach einen Kontext.

Mutex und Cond sind für Hardcore-Posix-Threading-Süchtige, und für meine Zwecke während der Entwicklung von Pthreads selbst. Normale Benutzer sollten diese Funktionalität nicht wirklich verwenden müssen, obwohl sie genauso gut dokumentiert ist wie die Gegenstück-Posix-Funktionen, und ein Großteil der Originaldokumentation gilt immer noch (mit einer vernünftigen Ebene oben). Mutex und Cond sind beide dünne Wrapper um vertraute Funktionen und nicht wirklich auf Joe Bloggs ausgerichtet.

Ich vermute, Sie fragen sich, ob Mutex erforderlich sind, um sicheres Lesen und Schreiben von Objekten zu haben, dies ist nicht der Fall, Sicherheit ist in Pthreads eingebaut.

Mal sollten Sie einen Thread über einen Worker verwenden; aus dem Beispiel, auf der kleinen Skala. Wenn Sie über die entsprechende Hardware verfügen, können Threads Workers (und Threads) erstellen, die sich für komplexere Systemdesign-Möglichkeiten eignen. In diesem Fall können Sie auch Ihre Threads so programmieren, dass sie sich wie Mitarbeiter verhalten, ohne dass die Objektinitialisierung (Stackables) für jede Aufgabe erforderlich ist. Ein Worker ist ein Thread, nur ein Teil der Funktionalität des Threads wurde erweitert, um eine Liste von Stackables auszuführen. Sie werden feine Unterschiede in den Synchronisationsmethoden von Thread und Worker bemerken, egal, ob Sie Worker wie vorgesehen verwenden . Wenn Sie jedoch aufgrund Ihrer Großartigkeit davon ausgehen, dass es besser ist, das Standardmodell zu vermeiden, benötigen Sie die Synchronisation von einem Thread-Objekt, um ein Worker-Muster in PHP zu implementieren.

Tatsache ist, dass, wenn Sie Threading suchen, Sie mehr als 2 oder 3 Dinge gleichzeitig tun möchten, die Chancen sind, dass Sie Wege gefunden haben könnten, ein paar Dinge zu tun. Die Bereitstellung der Worker/Stackable-Funktionalität als Teil des Pthreads-Pakets ist deshalb sinnvoll, weil es besser dazu geeignet ist, eine Menge Dinge in separaten Kontexten auszuführen. Das Schreiben in PHP (auch mit Hilfe von Pthreads) wäre trickreich.

+0

Vielen Dank! Das ist eine große Hilfe. Während mein Code funktionierte, war ich weit von der Spur entfernt. Ich frage mich immer noch, wann Sie das einfache Thread-Objekt verwenden würden. – marlonp33

+1

Okay, ich habe die Antwort mit ein paar Infos über Thread aktualisiert ... hoffentlich beantwortet das deine Frage vollständig. –

+0

Ich musste das mehrmals lesen, um zu verstehen, was du sagst. aber danke! – Nerrve

Verwandte Themen