19.09.2024
Heim / Internet / Anämischer Diskussionsthread PHP. Multithread-Computing in PHP: pthreads. Was sind Pthreads?

Anämischer Diskussionsthread PHP. Multithread-Computing in PHP: pthreads. Was sind Pthreads?

Es scheint, dass PHP-Entwickler selten Parallelität verwenden. Ich werde nicht über die Einfachheit des synchronen Codes sprechen; natürlich ist die Programmierung einfacher und klarer, aber manchmal geringer Nutzen Parallelität kann zu erheblichen Leistungsverbesserungen führen.

In diesem Artikel werfen wir einen Blick darauf, wie Multithreading in PHP mithilfe der pthreads-Erweiterung erreicht werden kann. Dazu muss die ZTS-Version (Zend Thread Safety) von PHP 7.x installiert sein installierte Erweiterung pthreads v3. (Zum Zeitpunkt des Verfassens dieses Artikels müssen Benutzer in PHP 7.1 vom Master-Zweig im pthreads-Repository installieren – siehe Drittanbieter-Erweiterung.)

Eine kleine Klarstellung: pthreads v2 ist für PHP 5.x gedacht und wird nicht mehr unterstützt, pthreads v3 ist für PHP 7.x und wird aktiv weiterentwickelt.

Kommen wir nach so einem Exkurs gleich zur Sache!

Bearbeitung einmaliger Aufgaben

Manchmal möchten Sie einmalige Aufgaben in einer Multithread-Methode verarbeiten (z. B. die Ausführung einer E/A-gebundenen Aufgabe). In solchen Fällen können Sie die Thread-Klasse verwenden, um einen neuen Thread zu erstellen und einige Verarbeitungen in einem separaten Thread auszuführen.

Zum Beispiel:

$task = neue Klasse erweitert Thread ( private $response; öffentliche Funktion run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $content, $matches); $this->response = $matches; ) ); $task->start() && $task->join(); var_dump($task->response); // string (6) „Google“

Hier ist die Ausführungsmethode unsere Verarbeitung, die in einem neuen Thread ausgeführt wird. Wenn Thread::start aufgerufen wird, wird ein neuer Thread erzeugt und die run-Methode aufgerufen. Anschließend verbinden wir den untergeordneten Thread wieder mit dem Hauptthread, indem wir Thread::join aufrufen, der blockiert, bis die Ausführung des untergeordneten Threads abgeschlossen ist. Dadurch wird sichergestellt, dass die Ausführung der Aufgabe abgeschlossen ist, bevor wir versuchen, das Ergebnis zu drucken (das in $task->response gespeichert ist).

Es ist möglicherweise nicht wünschenswert, eine Klasse mit zusätzlichen Verantwortlichkeiten im Zusammenhang mit der Ablauflogik zu belasten (einschließlich der Verantwortung für die Definition einer Ausführungsmethode). Wir können solche Klassen unterscheiden, indem wir sie von der Threaded-Klasse erben. Dann können sie in einem anderen Thread ausgeführt werden:

Klasse Task erweitert Threaded ( public $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->response = $matches; ) ) $task = new Task; $thread = new class($task) erweitert Thread ( private $task; öffentliche Funktion __construct(Threaded $task) ( $this->task = $task; ) öffentliche Funktion run() ( $this->task->someWork( ); ) ); $thread->start() && $thread->join(); var_dump($task->response);

Jede Klasse, die in einem separaten Thread ausgeführt werden muss muss erbt von der Threaded-Klasse. Dies liegt daran, dass es die notwendigen Fähigkeiten zur Durchführung der Verarbeitung in verschiedenen Threads sowie implizite Sicherheit und nützliche Schnittstellen (z. B. Ressourcensynchronisierung) bietet.

Werfen wir einen Blick auf die Klassenhierarchie, die die pthreads-Erweiterung bietet:

Threaded (implementiert durchquerbaren, sammelbaren) Thread Worker Volatile Pool

Wir haben die Grundlagen der Thread- und Threaded-Klassen bereits behandelt und erlernt. Werfen wir nun einen Blick auf die anderen drei (Worker, Volatile und Pool).

Threads wiederverwenden

Das Starten eines neuen Threads für jede Aufgabe, die parallelisiert werden muss, ist recht kostspielig. Dies liegt daran, dass in pthreads eine Common-Nothing-Architektur implementiert werden muss, um Multithreading in PHP zu erreichen. Das bedeutet, dass der gesamte Ausführungskontext der aktuellen Instanz des PHP-Interpreters (einschließlich aller Klassen, Schnittstellen, Merkmale und Funktionen) für jeden erstellten Thread kopiert werden muss. Da dies spürbare Auswirkungen auf die Leistung hat, sollte der Stream nach Möglichkeit immer wiederverwendet werden. Threads können auf zwei Arten wiederverwendet werden: mithilfe von Workern oder mithilfe von Pools.

Die Worker-Klasse wird verwendet, um eine Reihe von Aufgaben synchron innerhalb eines anderen Threads auszuführen. Dies geschieht durch das Erstellen einer neuen Worker-Instanz (die einen neuen Thread erstellt) und das anschließende Verschieben von Aufgaben auf den Stapel dieses separaten Threads (mithilfe von Worker::stack).

Hier ein kleines Beispiel:

Klasse Task erweitert Threaded ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $worker = new Worker(); $worker->start(); for ($i = 0; $i stack(new Task($i)); ) while ($worker->collect()); $worker->shutdown();

Im obigen Beispiel werden 15 Aufgaben für ein neues $worker-Objekt über die Worker::stack-Methode auf den Stapel verschoben und dann in der Reihenfolge verarbeitet, in der sie übertragen wurden. Die Worker::collect-Methode wird, wie oben gezeigt, zum Bereinigen von Aufgaben verwendet, nachdem deren Ausführung abgeschlossen ist. Damit blockieren wir innerhalb einer While-Schleife den Hauptthread, bis alle Aufgaben auf dem Stapel abgeschlossen und gelöscht sind – bevor wir Worker::shutdown aufrufen. Durch das vorzeitige Beenden eines Workers (d. h. während noch Aufgaben erledigt werden müssen) wird der Hauptthread immer noch blockiert, bis alle Aufgaben ihre Ausführung abgeschlossen haben, nur dass die Aufgaben nicht durch Garbage Collection gesammelt werden (was zu Speicherlecks führt).

Die Worker-Klasse stellt mehrere andere Methoden im Zusammenhang mit ihrem Aufgabenstapel bereit, darunter Worker::unstack zum Entfernen der letzten gestapelten Aufgabe und Worker::getStacked zum Abrufen der Anzahl der Aufgaben im Ausführungsstapel. Der Stack eines Workers enthält nur die Aufgaben, die ausgeführt werden müssen. Sobald eine Aufgabe auf dem Stapel abgeschlossen ist, wird sie entfernt und auf einem separaten (internen) Stapel zur Speicherbereinigung abgelegt (mithilfe der Methode Worker::collect).

Eine andere Möglichkeit, einen Thread über mehrere Aufgaben hinweg wiederzuverwenden, ist die Verwendung eines Thread-Pools (über die Pool-Klasse). Ein Thread-Pool verwendet eine Gruppe von Workern, um die Ausführung von Aufgaben zu ermöglichen gleichzeitig, in dem der Parallelitätsfaktor (die Anzahl der Pool-Threads, mit denen er arbeitet) beim Erstellen des Pools festgelegt wird.

Passen wir das obige Beispiel an, um einen Pool von Arbeitern zu verwenden:

Klasse Task erweitert Threaded ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $pool = new Pool(4); for ($i = 0; $i subscribe(new Task($i)); ) while ($pool->collect()); $pool->shutdown();

Es gibt einige bemerkenswerte Unterschiede bei der Verwendung eines Pools im Gegensatz zu einem Worker. Erstens muss der Pool nicht manuell gestartet werden; er beginnt mit der Ausführung von Aufgaben, sobald sie verfügbar sind. Zweitens, wir schicken Aufgaben an den Pool, nicht Lege sie auf einen Stapel. Darüber hinaus erbt die Pool-Klasse nicht von Threaded und kann daher nicht an andere Threads übergeben werden (im Gegensatz zu Worker).

Für Arbeiter und Pools ist es eine gute Praxis, ihre Aufgaben immer zu bereinigen, sobald sie abgeschlossen sind, und sie dann selbst manuell zu beenden. Threads, die mit der Thread-Klasse erstellt wurden, müssen auch an den übergeordneten Thread angehängt werden.

Pthreads und (Un)veränderlichkeit

Die letzte Klasse, die wir ansprechen werden, ist Volatile, eine neue Ergänzung zu pthreads v3. Unveränderlichkeit ist zu einem wichtigen Konzept in pthreads geworden, da ohne sie die Leistung erheblich leidet. Daher sind Eigenschaften von Threaded-Klassen, die selbst Threaded-Objekte sind, jetzt standardmäßig unveränderlich und können daher nach ihrer anfänglichen Zuweisung nicht überschrieben werden. Die explizite Veränderbarkeit solcher Eigenschaften wird derzeit bevorzugt und kann weiterhin mit der neuen Volatile-Klasse erreicht werden.

Schauen wir uns ein Beispiel an, das die neuen Unveränderlichkeitsbeschränkungen demonstriert:

Klassenaufgabe erweitert Threaded // eine Threaded-Klasse ( öffentliche Funktion __construct() ( $this->data = new Threaded(); // $this->data ist nicht überschreibbar, da es eine Threaded-Eigenschaft einer Threaded-Klasse ist) ) $task = new class(new Task()) erweitert Thread ( // eine Threaded-Klasse, da Thread Threaded erweitert öffentliche Funktion __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data); // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); // ungültig, da die Eigenschaft ein Threaded-Mitglied einer Threaded-Klasse ist ) );

Threaded-Eigenschaften von Volatile-Klassen hingegen sind veränderbar:

Klassenaufgabe erweitert Volatile ( öffentliche Funktion __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // gültig, da wir uns in einer flüchtigen Klasse befinden ) ) $task = new class(new Task()) erweitert Thread ( public function __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // immer noch ungültig, da Volatile Threaded erweitert, sodass die Eigenschaft immer noch ein Threaded-Mitglied einer Threaded-Klasse ist $this->volatileMember = new StdClass() );

Wir können sehen, dass die Volatile-Klasse die von ihrer übergeordneten Threaded-Klasse auferlegte Unveränderlichkeit außer Kraft setzt, um die Möglichkeit zu bieten, Threaded-Eigenschaften zu ändern (sowie sie zu deaktivieren()).

Es gibt ein weiteres Diskussionsthema zum Thema Variabilität und die Volatile-Klasse – Arrays. In pthreads werden Arrays automatisch in flüchtige Objekte umgewandelt, wenn sie einer Eigenschaft der Threaded-Klasse zugewiesen werden. Dies liegt daran, dass es einfach nicht sicher ist, ein Array mehrerer PHP-Kontexte zu manipulieren.

Schauen wir uns noch einmal ein Beispiel an, um einige Dinge besser zu verstehen:

$array = ; $task = new class($array) erweitert Thread ( private $data; öffentliche Funktion __construct(array $array) ( $this->data = $array; ) öffentliche Funktion run() ( $this->data = 4; $ this->data = 5; print_r($this->data) ); $task->start() && $task->join(); /* Ausgabe: Flüchtiges Objekt ( => 1 => 2 => 3 => 4 => 5) */

Wir sehen, dass flüchtige Objekte wie Arrays behandelt werden können, da sie Array-Operationen wie (wie oben gezeigt) den Subset()-Operator unterstützen. Allerdings unterstützen flüchtige Klassen keine grundlegenden Array-Funktionen wie array_pop und array_shift. Stattdessen stellt uns die Threaded-Klasse solche Operationen als integrierte Methoden zur Verfügung.

Als Demonstration:

$data = neue Klasse erweitert Volatile ( public $a = 1; public $b = 2; public $c = 3; ); var_dump($data); var_dump($data->pop()); var_dump($data->shift()); var_dump($data); /* Ausgabe: object(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) object(class@anonymous)#1 (1) ( ["b"]=> int(2) ) */

Zu den weiteren unterstützten Vorgängen gehören Threaded::chunk und Threaded::merge .

Synchronisation

Im letzten Abschnitt dieses Artikels werden wir uns mit der Synchronisierung in Pthreads befassen. Die Synchronisierung ist eine Methode, mit der Sie den Zugriff auf gemeinsam genutzte Ressourcen steuern können.

Lassen Sie uns beispielsweise einen einfachen Zähler implementieren:

$counter = neue Klasse erweitert Thread ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $counter->start(); for ($i = 0; $i i; ) $counter->join(); var_dump($counter->i); // gibt eine Zahl von 10 bis 20 aus

Ohne den Einsatz von Synchronisation ist die Ausgabe nicht deterministisch. Mehrere Threads schreiben ohne kontrollierten Zugriff auf dieselbe Variable, was bedeutet, dass Aktualisierungen verloren gehen.

Beheben wir das Problem, sodass wir die korrekte Ausgabe von 20 erhalten, indem wir das Timing hinzufügen:

$counter = neue Klasse erweitert Thread ( public $i = 0; public function run() ( $this->synchronized(function () ( for ($i = 0; $i i; ) )); ) ); $counter->start(); $counter->synchronized(function ($counter) ( for ($i = 0; $i i; ) ), $counter); $counter->join(); var_dump($counter->i); // int(20)

Synchronisierte Codeblöcke können auch über die Methoden Threaded::wait und Threaded::notify (oder Threaded::notifyAll) miteinander kommunizieren.

Hier ist ein alternatives Inkrement in zwei synchronisierten While-Schleifen:

$counter = neue Klasse erweitert Thread ( public $cond = 1; public function run() ( $this->synchronized(function () ( for ($i = 0; $i notify(); if ($this->cond === 1) ( $this->cond = 2; $this->wait(); ) ) )); $counter->start(); $counter->synchronized(function ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // warten, bis der andere zuerst startet ) for ($i = 10; $i notify(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $counter->join(); /* Ausgabe: int(0) int(10) int(1) int(11) int(2) int(12) int(3) int(13) int(4) int(14) int(5) int( 15) int(6) int(16) int(7) int(17) int(8) int(18) int(9) int(19) */

Möglicherweise bemerken Sie zusätzliche Bedingungen, die rund um den Aufruf von Threaded::wait platziert wurden. Diese Bedingungen sind wichtig, da sie die Fortsetzung des synchronisierten Rückrufs ermöglichen, wenn er eine Benachrichtigung erhalten hat und die angegebene Bedingung wahr ist. Dies ist wichtig, da Benachrichtigungen von anderen Orten als dem Aufruf von Threaded::notify kommen können. Wenn also Aufrufe der Threaded::wait-Methode nicht in Bedingungen eingeschlossen waren, werden wir sie ausführen falsche Weckrufe, was zu unvorhersehbarem Codeverhalten führt.

Abschluss

Wir haben uns die fünf Klassen des pthreads-Pakets (Threaded, Thread, Worker, Volatile und Pool) und die Verwendung jeder Klasse angesehen. Wir haben uns auch das neue Konzept der Unveränderlichkeit in pthreads angesehen kurzer Überblick Unterstützte Synchronisierungsfunktionen. Nachdem wir diese Grundlagen geschaffen haben, können wir uns nun damit befassen, wie pthreads in realen Fällen eingesetzt werden können! Dies wird das Thema unseres nächsten Beitrags sein.

Wenn Sie an der Übersetzung des nächsten Beitrags interessiert sind, lassen Sie es mich wissen: Kommentieren Sie es in den sozialen Medien. Netzwerke, bewerten Sie den Beitrag und teilen Sie ihn mit Kollegen und Freunden.

Thread-Diskussion

A Thread-Diskussion ist eine elektronische Diskussion (z. B. per E-Mail, E-Mail-Liste, Bulletin Board, Newsgroup oder Internetforum), bei dem die Software den Benutzer durch die visuelle Gruppierung von Nachrichten unterstützt. Nachrichten werden normalerweise visuell in einer Hierarchie nach Themen gruppiert. Eine auf diese Weise gruppierte Gruppe von Nachrichten wird als a bezeichnet Thementhread oder einfach „einfädeln“. Ein Diskussionsforum, ein E-Mail-Client oder ein News-Client verfügt über „Thread-Themen“, wenn er Nachrichten zum gleichen Thema gruppiert, um sie auf diese Weise leichter lesen zu können. Darüber hinaus ermöglichen Thread-Diskussionen den Benutzern in der Regel, auf einen bestimmten Beitrag innerhalb des Threads eines Themas zu antworten. Daher kann es innerhalb des Thread-Themas eine Hierarchie von Diskussionen geben. Verschiedene Arten von Software ermöglichen möglicherweise die Anzeige dieser Hierarchie in „Was“. Dies wird als Threaded-Modus bezeichnet. (Die Alternative ist der lineare Modus, der normalerweise alle Beiträge in der Reihenfolge ihres Datums anzeigt, unabhängig davon, wer wem konkret geantwortet hat.)

Vorteile

Der Vorteil hierarchisch gegliederter Ansichten besteht darin, dass sie es dem Leser ermöglichen, schnell die Gesamtstruktur einer Konversation zu erkennen: insbesondere, wer wem antwortet. Daher ist es am nützlichsten in Situationen mit längeren Gesprächen oder Debatten, wie etwa in Newsgroups: Tatsächlich wird es bei wirklich komplexen Debatten schnell unmöglich, der Argumentation zu folgen, ohne dass eine Art hierarchisches Threading-System vorhanden ist.

Ein weiterer Vorteil liegt in der subtileren Wertschätzung der Gemeinschaft in hierarchisch strukturierten Systemen. Da Antworten auf bestimmte Beiträge erfolgen müssen, erfolgen diese auch an bestimmte Personen. Threaded-Gespräche neigen daher dazu, den Autor auf die spezifischen Ansichten und die Persönlichkeit der Person zu konzentrieren, auf die geantwortet wird. Dies geschieht weniger in Foren, in denen der neueste Kommentar einfach in den allgemeinen Pool eingefügt wird.

Nachteile

Ein Nachteil des hierarchischen Einfädelns gegenüber dem flachen Einfädeln besteht in einem höheren Grad an Komplikation, und eine solche Ansicht erfordert daher ein höheres Maß an Komfort und Raffinesse seitens der Benutzer. Daher ist es nicht verwunderlich, dass die Verbreitung in einigen der ältesten und/oder fortschrittlichsten Online-Communities wie Usenet, CIX oder Slashdot am stärksten ist. Web-Chat- und Kommentarsysteme sind im Vergleich jünger und offen für ein breiteres Publikum, und daher ist hierarchisches Threading in solchen Bereichen erst seit kurzem alltäglich.

Das Auferlegen einer Baumhierarchie führt auch dazu, dass die Diskussion innerhalb eines Themas fragmentiert wird: Es ist nicht mehr möglich, eine Nachricht zu posten, die auf mehrere verschiedene frühere Beiträge reagiert oder diese zusammenfasst. Stattdessen muss auf jeden vorherigen Beitrag einzeln reagiert werden. Es lässt sich argumentieren, dass dies zu einem konfrontativeren Debattenstil in Foren führt, die hierarchische Threads verwenden. So wahr das auch sein mag: Wenn eine direkte Thread-Antwort aufgrund der Menge an Antworten auf den gewünschten Beitrag nicht mehr möglich ist, verwenden Benutzer heutzutage häufig Zitate der Person, auf die sie antworten, um die Konversation auf Kurs und im Fluss zu halten glatt Dies wird von den meisten Message-Board-Communitys für den Fall empfohlen, dass das Threading seine ansonsten umfassende Grenze erreicht hat.

Thread öffnen

Ein offener Thread bezieht sich auf einen Blog-Beitrag, in dem Leser jedes von ihnen ausgewählte Thema kommentieren und diskutieren können. Sie sind normalerweise auf beliebten Blogs mit großen Mengen nützlicher Verkehr; Sie werden oft verwendet, wenn der Autor des Blogs kein Thema zum Posten hat oder wenn es eine Flaute beim Posten gibt.

Offene Threads werden auch verwendet, um die Monotonie der Beiträge auf den Hauptseiten von Blogs aufzulockern. Kommentare können sich auf inhaltsorientierten Beiträgen aufbauen; Daher nutzen Autoren die offenen Threads, damit die Seitenladezeiten nicht verlangsamt werden.

Beispiele

*Yahoo! Gruppen [ http://groups.yahoo.com/], MSN-Gruppen [ http://groups.msn.com/] und Slashdot [ http://www.slashdot.com/] bieten alle webbasierte Foren mit Thread-Diskussionen an.

Siehe auch

*Wissenschaftliches Skywriting
* Liste der Blogging-Begriffe

Referenzen

*Dartmouth. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html „Diskussion online führen“ ]
*Wolsey, T. DeVere, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html „Literaturdiskussion im Cyberspace: Junge Jugendliche nutzen Thread-Diskussionsgruppen, um über Bücher zu sprechen.“] . „Reading Online“, 7(4), Januar/Februar 2004. Abgerufen am 30. Dezember 2007

Wikimedia-Stiftung.

  • 2010.
  • Leon Powe

Barh Azoum

    Schauen Sie sich andere Wörterbücher an: Internetforum

    - Das phpBB Internet Forum-Softwarepaket, eines der beliebtesten Forenpakete… Wikipedia Geschichte virtueller Lernumgebungen 1990er Jahre

    – In der Geschichte der virtuellen Lernumgebungen waren die 1990er Jahre eine Zeit des Wachstums, vor allem aufgrund der Einführung erschwinglicher Computer und des Internets.1990er1990* Formal Systems Inc. aus Princeton, NJ, USA führt eine DOS-basierte Bewertung ein… … Wikipedia- Kollaborative Face-to-Face-Entwickler für Bildungsumgebungen LEAD-Konsortium Stabile Version 5.0 / Juni 2010 Betriebssystem Plattformübergreifend … Wikipedia

    Konversationsthreading- ist eine Funktion, die von vielen E-Mail-Clients, Bulletin Boards, Newsgroups oder Internetforen verwendet wird und bei der die Software den Benutzer durch die visuelle Gruppierung von Nachrichten unterstützt. Nachrichten werden normalerweise visuell in einer Hierarchie nach Themen gruppiert. Eine Reihe von Nachrichten gruppiert... ... Wikipedia

    Schrägstrich- Screenshot der Slashdot.org-Hauptseiten-URL slashdot.org Slogan News für Nerds. Dinge, die wichtig sind ... Wikipedia

    MediaWiki- Namespace-Weiterleitungen hier. Hilfe zum MediaWiki-Namespace auf Wikipedia finden Sie unter Hilfe:MediaWiki-Namespace. Allgemeine Informationen zu Wikipedia-Namespaces finden Sie unter Wikipedia:Namespace. Diskussionsseite und Weiterleitung der MediaWiki-Diskussionsseite hier. Für... ... Wikipedia

    Computervermittelte Kommunikation- Für andere Verwendungen siehe CMC (Begriffsklärung). Computervermittelte Kommunikation (CMC) ist definiert als jede kommunikative Transaktion, die durch die Verwendung von zwei oder mehr vernetzten Computern erfolgt. Während sich der Begriff traditionell auf diese bezieht … … Wikipedia

    Vergleich von Wiki-Software- In den folgenden Tabellen werden allgemeine und technische Informationen für eine Reihe von Wiki-Softwarepaketen verglichen. Inhalt 1 Allgemeine Informationen 2 Zielgruppe 3 Features 1 4 Features 2 … Wikipedia

    Wissenschaftliches Skywriting- ist ein vom Kognitionswissenschaftler Stevan Harnad geprägter Begriff, der die Kombination aus mehreren E-Mails und einem themenbezogenen Webarchiv wie einer Newsgroup, einer elektronischen Mailingliste, Hypermail, Netnews oder einem Internetforum beschreibt, die nach Datum verknüpft und sortierbar sind, … … Wikipedia

    Kollaborative Entscheidungssoftware- Collaborative Decision Making (CDM)-Software ist eine Softwareanwendung oder ein Modul, das die Funktionen und Merkmale koordiniert, die erforderlich sind, um rechtzeitig zu kollektiven Entscheidungen zu gelangen, und es allen relevanten Interessengruppen ermöglicht, am Prozess teilzunehmen. Die... ... Wikipedia

Ich habe kürzlich pthreads ausprobiert und war angenehm überrascht – es ist eine Erweiterung, die die Möglichkeit hinzufügt, mit mehreren echten Threads in PHP zu arbeiten. Keine Nachahmung, keine Magie, keine Fälschungen – alles ist echt.



Ich denke über eine solche Aufgabe nach. Es gibt einen Pool an Aufgaben, die schnell erledigt werden müssen. PHP verfügt über andere Tools zur Lösung dieses Problems, diese werden hier nicht erwähnt, der Artikel handelt von pthreads.



Was sind Pthreads?

Das ist es! Na ja, fast alles. Tatsächlich gibt es etwas, das einen neugierigen Leser verärgern könnte. Nichts davon funktioniert auf Standard-PHP, das mit Standardoptionen kompiliert wurde. Um Multithreading genießen zu können, muss ZTS (Zend Thread Safety) in Ihrem PHP aktiviert sein.

PHP-Setup

Als nächstes PHP mit ZTS. Achten Sie nicht auf einen so großen Unterschied in der Ausführungszeit im Vergleich zu PHP ohne ZTS (37,65 vs. 265,05 Sekunden), ich habe nicht versucht, die PHP-Einstellungen zu verallgemeinern. Im Fall ohne ZTS habe ich beispielsweise XDebug aktiviert.


Wie Sie sehen, ist die Geschwindigkeit der Programmausführung bei Verwendung von 2 Threads etwa 1,5-mal höher als bei linearem Code. Bei Verwendung von 4 Fäden - 3 Mal.


Sie können feststellen, dass die Ausführungszeit des Programms trotz des 8-Kern-Prozessors nahezu unverändert blieb, wenn mehr als 4 Threads verwendet wurden. Es scheint, dass dies daran liegt, dass mein Prozessor über 4 physische Kerne verfügt. Der Übersichtlichkeit halber habe ich die Platte in Form eines Diagramms dargestellt.


Wieder aufnehmen

In PHP lässt sich mit der Erweiterung pthreads recht elegant mit Multithreading arbeiten. Dies führt zu einer spürbaren Produktivitätssteigerung.

Tags: Tags hinzufügen

Die Mutter einer guten Freundin von mir verlor ihren Koffer auf einem Flug von St. Petersburg nach Moskau, sie musste noch einen weiteren Flug in wärmere Gefilde unternehmen und war nun schon im Resort – ohne Badeanzug, Sandalen und nur mit T-Shirt -Shirt aus ihrem Handgepäck. Der alten Zeit zuliebe habe ich ihr ein paar Tipps gegeben, was sie tun und wohin sie laufen sollte, und heute habe ich beschlossen, hier alles, was ich zu einem bestimmten Thema weiß, aufzuschreiben.

Um zu erklären, warum ich so schlau bin, möchte ich Sie daran erinnern, dass ich einmal im Bodendienst für mehrere Fluggesellschaften gearbeitet habe, wo ich mich unter anderem mit bestimmten Problemen im Zusammenhang mit der Gepäcksuche befasst habe. Na ja, plus natürlich meine eigene Flugerfahrung. Allerdings, weil Ich habe die Luftfahrtdienstleistungsbranche vor einigen Jahren verlassen, vielleicht haben sich einige Nuancen geändert – wenn ja, nehme ich Kommentare zu diesem Thema dankbar an und korrigiere die Informationen im Beitrag.

Ich werde damit beginnen Was Sie tun müssen, um den Verlust Ihres Gepäcks zu verhindern:
1. Reißen Sie alle Anhänger und Aufkleber von früheren Reisen von Ihrem Koffer ab, auch kleine mit Barcode, die oft separat auf den Koffer selbst geklebt sind – sie können das automatische Gepäckscan- und Sortiersystem durcheinander bringen.
2. Hängen Sie ein Namensschild an Ihren Koffer (Tasche, Karton, Paket – im Allgemeinen alles, was Sie als Gepäck aufgeben): Sie können im Voraus eine wiederverwendbare Option kaufen oder am Check-in-Schalter ein Papieretikett mitnehmen – normalerweise alles halbwegs anständige Fluggesellschaften geben sie ohne Einschränkungen aus. Und Emirates zum Beispiel verfügt im Allgemeinen über hervorragende Kunststoffanhänger an einer haltbaren Kordel, die sehr lange halten kann:

Alte Paranoiker können es wie ich machen: An meinem Koffer hängt immer ein wiederverwendbarer Plastikanhänger aus dem Samsonite-Set mit meiner ständigen Wohnadresse, Telefonnummer usw per E-Mail, und wenn ich irgendwohin in den Urlaub fliege, hänge ich zusätzlich einen Zettel auf, auf dem ich die Daten meines Aufenthalts am neuen Ort und alle möglichen Kontakte (Name und Adresse des Hotels, ggf. örtliche Telefonnummer, und natürlich mein Vor- und Nachname).
3. Stellen Sie am Check-in-Schalter sicher, dass Ihr Gepäck mit dem Gepäckanhänger versehen ist, den der Check-in-Agent ausdruckt – mit dem Stadtcode, zu dem Sie fliegen, und der Flugnummer.
4. Wenn Sie mehrere Anschlussflüge haben, teilen Sie dies dem Check-in-Agenten mit und geben Sie an, bis zu welchem ​​Punkt Sie Ihr Gepäck aufgeben möchten. In einigen Fällen muss das Gepäck unabhängig von Ihrem Wunsch an dem einen oder anderen Flughafen entlang der Strecke abgeholt werden: Dies gilt beispielsweise für Transfers zwischen Flughäfen (Orly und Charles de Gaulle in Paris, Domodedovo – Sheremetyevo – „Vnukovo“) " in Moskau), separate Terminals (Terminals 1 und 2 in Frankfurt) oder am ersten Ankunftsort in den USA oder Mexiko - dies ist in diesen Ländern eine Zollanforderung: Angenommen, Sie fliegen Moskau-Washington-Phoenix, ein Gepäckanhänger wird für alle drei Segmente nach Phoenix ausgestellt, aber in Washington muss das Gepäck physisch abgeholt, durch den Zoll abgefertigt und erneut eingecheckt werden. Auch wenn Sie einen Kinderwagen aufgeben, den Sie vor dem Einsteigen mitnehmen durften B. ein Flugzeug oder ein Tier, müssen Sie es wahrscheinlich an einem Transitpunkt abholen. Generell ist es bei einer komplexen Route mit Transfers besser, die Einzelheiten der Gepäckbewegungen vorab im Callcenter der Fluggesellschaft oder im Extremfall beim Check-in zu klären.
5. Machen Sie Ihr Gepäck sichtbar: Gepäckverspätungen sind nicht immer auf die Gepäckabfertiger oder Fehler im Sortiersystem zurückzuführen. Manchmal nimmt ein anderer geistesabwesender Passagier, der nach einem langen Flug müde ist, dieselbe schwarze Samsonite- oder unscheinbare Sporttasche wie Sie aus dem Gepäckband. Markieren Sie deshalb Ihr Gepäck: Hängen Sie ein paar bunte Bänder oder ein kleines Stofftier an den Griff, kleben Sie einen großen Aufkleber darauf oder bevorzugen Sie bei der Kofferauswahl einfach eine ungewöhnliche Farbe.

Was darf nicht im Gepäck aufgegeben werden?
Denken Sie daran, dass bei allen Fluggesellschaften und Flughäfen Gepäck verloren geht. Natürlich sind die Statistiken für jeden anders, aber selbst bei den zuverlässigsten Fluggesellschaften kann es passieren, dass Gepäck verloren geht oder sich verspätet, und selbst am kleinsten Flughafen, wo ein einzelner Gepäckabfertiger einen Wagen mit Koffern direkt vom Check-in-Schalter zum Flugzeug transportiert. Daher rate ich Ihnen, immer Ihr Handgepäck mitzunehmen:
- wichtige Dokumente, auch solche, die während des Fluges nicht benötigt werden (z. B. musste ich bei meiner letzten Reise nach St. Petersburg meinen Führerschein ändern und im Handgepäck nahm ich eine Heiratsurkunde und alle möglichen Karten von mit eine Fahrschule)
- Schlüssel (in Kombination mit einem Anhänger mit Ihrer Adresse kann dies gefährlich sein)
- Geld, Schmuck (keine Kommentare)
- teure, zerbrechliche Ausrüstung
- Medikamente, die Sie regelmäßig einnehmen, in der für den Flug erforderlichen Menge und mit einer kleinen Reserve für den Fall, dass Sie in einem fremden Land oder einer fremden Stadt nach einem Analogon suchen müssen. Verschreibungspflichtige Medikamente, die bei Gepäckverlust nicht erworben werden können, nehmen Sie bitte in der für die gesamte Reise notwendigen Menge mit.
- etwas, das bei der Ankunft möglicherweise dringend benötigt wird (z. B. Ladegerät für Telefon
- etwas, das für Sie persönlich einen sentimentalen Wert hat: Manchmal geht Gepäck für immer verloren, und wenn Ihnen der Verlust Ihres persönlichen Tagebuchs das Herz bricht, lassen Sie es besser zu Hause oder nehmen Sie es mit ins Flugzeug

Eine lehrreiche Geschichte: Während meiner Zeit bei der Lufthansa in St. Petersburg lief ein Ehepaar aus den USA händeringend in unser Büro – ihr Gepäck, das sehr wichtige Dokumente für den Adoptionsprozess enthielt, war nicht angekommen, Die Verhandlung fand am nächsten Tag statt. Natürlich ist die Fluggesellschaft für den Gepäckverlust verantwortlich, aber wem nützt das? Um eine solche Situation zu vermeiden, genügte es, wichtige Papiere einfach ins Handgepäck zu packen.

Sie sind also angekommen und haben Ihr Gepäck nicht auf dem Gepäckband gefunden. Was zu tun?
1. Wenn Sie in Ihrem Gepäck etwas anderes als gewöhnliche Koffer eingecheckt haben: Skier, ein Cello, einen wandgroßen Plasmabildschirm, einen Kinderwagen, eine lebendige Marmordäne, prüfen Sie, ob es eine separate Stelle für die Ausgabe der sogenannten gibt. Übergroßes Gepäck oder Sperrgepäck – Gepäck, das dem oben beschriebenen ähnelt, wird oft in ein separates Fach geladen und separat manuell entladen. Wenn Ihr Gepäck auch dort nicht gefunden wird
2. Gehen Sie zum Gepäckermittlungs- oder Lost & Found-Schalter. Dort müssen Sie ein spezielles Formular ausfüllen detaillierte Informationenüber Ihr Gepäck: Route, Aussehen, eine kurze Inhaltsliste, Ihre Kontakte an Ihrem ständigen Wohnort und vorübergehenden Aufenthaltsort. Außerdem ist es bei der Gepäckermittlung wahrscheinlicher, dass Sie eine Gepäcktabelle wie diese sehen:

Gemäß dieser Klassifizierung wird Ihr fehlendes Gepäck codiert, und wie Sie wissen, werden diese beiden Koffer gleich codiert:

Fügen Sie der Beschreibung also gerne weitere Details hinzu und überspringen Sie nicht die Inhaltsklausel. In der Regel werden Sie beim ersten Ausfüllen einer Gepäckverspätungsmeldung aufgefordert, mehrere Inhalte anzugeben, anhand derer Ihr Gepäckstück identifiziert werden kann, wenn auf der Außenseite keine Erkennungszeichen vorhanden sind und das Gepäckstück geöffnet werden muss (falls vorhanden). Wenn der Beutel geöffnet wird, erhalten Sie hierüber eine Benachrichtigung). Schlechtes Beispiel: T-Shirt / Buch / Feuchttücher, gutes Beispiel: knallroter Bikini / Katalog von Malewitsch-Reproduktionen / Falteisen. Nach dem Ausfüllen des Antrags erhalten Sie vom Mitarbeiter des Gepäckermittlungsdienstes eine Nummer im Format XXXYY11111, wobei Sie sind mit Lufthansa zum Kennedy Airport in New York geflogen. Merken Sie sich diese Nummer oder notieren Sie sie – so finden Sie Ihre Bewerbung in zukünftigen Bewerbungen am einfachsten.
Mit derselben Nummer können Sie den Suchstatus SELBST überprüfen (Aus irgendeinem Grund verschwindet der Link: Wenn es bei Ihnen nicht funktioniert, googeln Sie World Tracer Online und buchstäblich ist der zweite Link – mit der Überschrift Baggage Tracing auf der Website worldtracer.aero – das, was Sie brauchen), weil Sie zu Lost&found durchkommen ist oft sehr schwierig
3. Versuchen Sie, das Büro Ihrer Fluggesellschaft am Ankunftsflughafen zu kontaktieren: Manchmal (ich betone: MANCHMAL!), wenn Sie nicht nach Hause, sondern an einen vorübergehenden Aufenthaltsort (Urlaub, Geschäftsreise) geflogen sind, kann die Fluggesellschaft ein Set bereitstellen von Toilettenartikeln (bei Lufthansa gibt es ein übergroßes T-Shirt, eine Zahnbürste und Zahnpasta, einen Kamm, kleine Päckchen Shampoo und Duschgel, ein Päckchen Waschpulver usw.) oder leisten Sie vor Ort eine kleine Barzahlung für kleinere Ausgaben (Barzahlung vor Ort).

Was wird als nächstes passieren?
Ihre Datei (die sogenannte AHL) wird an das zentrale Gepäcksuchsystem (World Tracer) weitergeleitet. Alle nicht abgeholten Gepäckstücke fallen in das gleiche Suchsystem, unabhängig davon, ob sie ohne Etikett in den Ecken und Winkeln des Gepäcklagers gefunden wurden oder auf dem Gepäckband verblieben sind. Für jedes dieser Gepäckstücke gibt es eine Datei im Format XXXYY11111 ebenfalls erstellt, nur von einem anderen Untertyp – dem sogenannten. Vorhandener Bericht oder OHD. Wenn die Daten aus den AHL- und OHD-Dateien übereinstimmen (Nachname, Beschreibung des Koffers, Route usw.), erhalten beide Stationen (an denen der Gepäckverlust gemeldet wurde und an denen das nicht abgeholte Gepäck gefunden wurde) eine Benachrichtigung und dann Es ist eine Frage der Technik: Gepäck erneut aufgeben und im Erfolgsfall in die gewünschte Stadt weiterleiten. Natürlich eine große Anzahl selbst gemacht- Nachrichten senden, ähnliche, aber nicht identische Koffer ablehnen sowie auf mehrere Koffer antworten Telefonanrufe- Generell wird es den Mitarbeitern des Gepäcksuchdienstes nie langweilig.
Ungefähre Statistik: Mehr als 90 % des verlorenen Gepäcks werden in den ersten drei Tagen der Suche gefunden, 3 % sind für immer verloren.
Was können Sie tun?
1. Wenn Sie bei Ihrer Ankunft dringend benötigte Dinge kaufen müssen (von der Zahnbürste bis zum Business-Anzug), bewahren Sie unbedingt Ihre Quittungen für eine spätere Entschädigung auf. Sie sollten jedoch unnötige teure Anschaffungen vermeiden; ich werde später erklären, warum.
2. Erstellen Sie nach neuen Schritten eine möglichst detaillierte Inhaltsliste, vorzugsweise mit Farbe, Marke und ungefähre Kosten Bitte wenden Sie sich an die Fluggesellschaft und senden Sie diese Liste an sie, idealerweise auf Englisch (andernfalls muss ein Mitarbeiter der Fluggesellschaft diese Liste übersetzen, um sie in das System einzugeben). Sie wird der Anwendung zur Gepäcksuche hinzugefügt. In den ersten 5 Tagen wird die Suche nach Gepäck vom Ankunftsflughafen durchgeführt, dann liegt die Verantwortung für die Suche bei der Fluggesellschaft (der Fluggesellschaft, die in der Antragsnummer angegeben ist – erinnern Sie sich an JFKLH12345?) und nach 21 Tagen bei Ihnen kann eine endgültige Entschädigung beantragen.
3. Wenn das verlorene Gepäck innerhalb von 21 Tagen ab dem Datum der Einreichung der Meldung nicht gefunden wurde, wenden Sie sich an die Fluggesellschaft, um eine Entschädigung zu verlangen. Wenn ich mich nicht irre, beträgt die Verjährungsfrist 2 Jahre, also Sie können innerhalb von zwei Jahren ab dem Datum der Geltendmachung eines Schadensersatzanspruchs einen Schadensersatzantrag stellen.

Zahlung einer Entschädigung.
Um eine Entschädigung zu zahlen, müssen Sie sich mit einem Zahlungsantrag, Dokumenten zur Bestätigung des Fluges und der Tatsache des Gepäckverlusts (Bordkarten, Gepäckanhänger, Anspruchsnummer für Gepäckverlust, Zahlungsdetails) an die Vertretung Ihrer Fluggesellschaft wenden. Wenn ich mich nicht irre, muss in der Russischen Föderation eine Entscheidung über eine Entschädigung innerhalb von 30 Tagen rechtskräftig geprüft werden. Möglicherweise werden Sie auch gebeten, die Kosten für den Inhalt zu schätzen und, wenn möglich, Belege für den Kauf des Koffers und der darin enthaltenen Artikel vorzulegen (ich verstehe, dass dies in den meisten Fällen unrealistisch ist, aber das ist Teil des Verfahrens).
Bisher erfolgte die Zahlung auf Grundlage des Gewichts des aufgegebenen Gepäcks – etwa 20 US-Dollar pro Kilogramm. Später wurde das Bezahlsystem geändert und die Haftung der Fluggesellschaften auf 1.000 konventionelle Einheiten begrenzt (die Kosten für eine konventionelle Einheit werden innerhalb der Fluggesellschaft berechnet), was zum Zeitpunkt meiner Tätigkeit etwa 1.300 Euro entsprach. Diese. Selbst wenn Sie eine Quittung für den Kauf eines Louis Vuitton-Koffers aus tausenden bolivianischen Geckofellen und gefüllt mit Diamanten mitbringen, erhalten Sie nicht mehr als 1.300 Euro.