SimpleFork Projektadresse: https://github.com/huyanping/simple-fork-phpMultiprozess-Prozess-Parallelitäts-Framework basierend auf der PCNTL-Erweiterung, der Schnittstelle ähnelt Javas Thread und RunnableWarum sollten wir SimpleFork schreiben? Das Schreiben von Multiprozessprogrammen ist komplizierter als das Schreiben von Multithreads. Probleme wie Prozessrecycling, Synchronisierung und Gegenseitigkeit Ausgrenzung und Kommunikation müssen berücksichtigt werden. Für Anfänger wird es schwierig sein, mit den oben genannten Problemen umzugehen. Gerade im Bereich der Signalverarbeitung und Prozesskommunikation lassen sich Probleme nur schwer vermeiden. SimpleFork bietet eine Reihe von Prozesssteuerungsschnittstellen ähnlich dem JAVA-Multithreading, die Recycling, Synchronisierung, gegenseitigen Ausschluss, Kommunikation und andere Lösungen ermöglichen. Entwickler können sich auf geschäftliche Probleme konzentrieren und müssen nicht zu viel über Prozesssteuerung nachdenken. Einführung composer require jenner/simple_forkrequirepath/to/SimpleFork/autoload.phpAbhängigkeit Muss
ext-pcntl-Prozesssteuerung
Optional
ext-sysvmsg-Nachrichtenwarteschlange
ext-sysvsem-Synchronisations-Mutex-Sperre
ext-sysvshm Shared Memory
Funktionen
Prozesspool bereitstellen
Zombie-Prozessrecycling automatisch verarbeiten und nicht blockierende Aufrufe unterstützen
Bietet gemeinsam genutzten Speicher, eine System-V-Nachrichtenwarteschlange und eine Semaphorsperre, um die IPC-Kommunikation (Prozesskommunikation) zu erleichtern.
Bietet zwei Methoden, Process und Runnable, um den Prozess zu implementieren.
Kann erhalten Prozess in Echtzeit Status
Wenn Sie alle Prozesse herunterfahren oder nur einen Prozess stoppen, können Sie sich registrieren, um die Methode beforeExit() zu überschreiben. Geben Sie „true“ zurück, um zu beenden, und „false“, um die Ausführung fortzusetzen (in einigen Szenarien ist dies für den Prozess nicht möglich). sofort beenden)
Neuladen unterstützen, wenn der untergeordnete Prozess ausgeführt wird
Hinweise
Die System V-Nachrichtenwarteschlange wird nicht zerstört, da sie möglicherweise nicht zerstört wird Beim Beenden des Programms handelt es sich um unverarbeitete Daten. Wenn es zerstört werden muss, rufen Sie bitte die Methode $queue->remove() auf, um die Warteschlange zu löschen.
Der gemeinsam genutzte Speicher wird gelöscht, nachdem alle Prozesse beendet wurden.
Das Semaphore-Objekt wird gelöscht zerstört, wenn das Objekt recycelt wird
Nach dem Prozesspool start() müssen Sie wait() aufrufen, um den Zombie-Prozess zu recyceln.
Bevor Sie den Prozess abrufen status (Aufruf der isAlive()-Methode), es ist am besten, eine nicht blockierende Wartefunktion (false) aufzurufen. Da die Beurteilung des laufenden Prozesses keine atomare Operation ist, kann die isAlive()-Methode nicht garantiert werden dass es vollständig mit dem tatsächlichen Status übereinstimmt
Wenn Sie nicht wissen, unter welchen Umständen Sie es am Anfang der Programmdeklaration (ticks=1); hinzufügen müssen, dann ist es am besten, dies hinzuzufügen Anweisung standardmäßig in die erste Zeile ein.
Verwendung von „declare(ticks=1);“
„declare(ticks=1);“ Diese Deklaration wird zur Prozesssignalverarbeitung verwendet. Wenn ein Signalhandler registriert ist, prüft das Programm vor der Ausführung einer Codezeile automatisch, ob nicht behandelte Signale vorhanden sind. http://php.net/manual/zh/control-structures.declare.php
TODO
提供更多功能的进程池,模仿java
提供第三方进程通信机制(Redis等)
更多的测试及示例程序
示例程序 更多示例程序见exmples目录simple.phpclassTestRunnableextends\Jenner\SimpleFork\Runnable{/** * 进程执行入口 * @return mixed */publicfunctionrun() {echo"I am a sub process".PHP_EOL; }}$process=new\Jenner\SimpleFork\Process(newTestRunnable());$process->start();shared_memory.phpclassProducerextends\Jenner\SimpleFork\Process{publicfunctionrun(){for($i=0; $i<10; $i++){$this->cache->set($i, $i);echo"set {$i} : {$i}".PHH_EOL; } }}classWorkerextends\Jenner\SimpleFork\Process{publicfunctionrun(){sleep(5);for($i=0; $i<10; $i++){echo"get {$i} : ".$this->cache->get($i) .PHP_EOL; } }}$memory=new\Jenner\SimpleFork\IPC\SharedMemory();$producer=newProducer();$producer->setCache($memory);$worker=newWorker();$worker->setCache($memory);$pool=new\Jenner\SimpleFork\Pool();$pool->submit($producer);$pool->submit($worker);$pool->start();$pool->wait();
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn