PHP forking und mehrere Kindsignale

8

Ich versuche ein Skript zu schreiben, das eine Anzahl von gespaltenen Kindprozessen erzeugt, indem ich die pcntl_* verwende. Funktionen .

Grundsätzlich gibt es ein einzelnes Skript, das ungefähr eine Minute lang in einer Schleife läuft und regelmäßig eine Datenbank abfragt, um festzustellen, ob eine Aufgabe ausgeführt werden soll. Wenn es einen gibt, sollte es die Aufgabe in einem separaten Prozess auslagern und ausführen, damit das übergeordnete Element nicht von einer lang andauernden Aufgabe gehalten wird.

Da möglicherweise eine große Anzahl von Tasks ausgeführt werden kann, möchte ich die Anzahl der untergeordneten Prozesse begrenzen, die erstellt werden. Daher behalte ich die Anzahl der Prozesse im Auge, indem ich eine Variable bei jeder Erstellung inkrementiere (und dann pausiere, wenn es zu viele gibt) und sie dann in einem Signalhandler dekrementiere. So ähnlich:

%Vor%

Das funktioniert meistens ziemlich gut, außer wenn zwei oder mehr Prozesse gleichzeitig enden - die Signal-Handler-Funktion wird nur einmal aufgerufen, was meinen Zähler auswirft. Der Grund dafür wird von "Anonymous" in den Hinweisen des PHP-Handbuchs erklärt:

  

Mehrere Kinder geben weniger zurück als die Anzahl der Kinder, die zu einem bestimmten Zeitpunkt austreten SIGCHLD-Signale sind normales Verhalten für Unix-Systeme (POSIX). SIGCHLD könnte gelesen werden als "ein oder mehrere Kinder den Status geändert haben - gehe deine Kinder untersuchen und erhalte ihre Statuswerte".

Meine Frage lautet wie folgt: Wie untersuche ich die Kinder und erhalte ihren Status? Gibt es eine zuverlässige Möglichkeit, zu prüfen, wie viele untergeordnete Prozesse zu einem bestimmten Zeitpunkt geöffnet sind?

Verwenden von PHP 5.2.9

    
nickf 16.02.2010, 06:54
quelle

2 Antworten

2

Eine Möglichkeit besteht darin, ein Array der PIDs der untergeordneten Prozesse beizubehalten, und im Signal-Handler jede PID zu überprüfen, um festzustellen, ob sie noch läuft. Der (nicht getestete) Code würde wie folgt aussehen:

%Vor%     
wavemode 09.04.2015 02:32
quelle
0

Sie könnten Kinder haben, die ein SIGUSR1 an das übergeordnete Element senden, wenn sie gestartet werden, und dann ein SIGUSR2, bevor sie beendet werden. Die andere Sache, mit der Sie bei der Verwendung primitiver Signale zu tun haben, ist der Kernel, der sie zusammenführt, was sie nicht mit RT-Signalen tun. Theoretisch könnte jedes Nicht-RT-Signal zusammengeführt werden.

Sie können eine Art von einfachem Sperren mit sqlite implementieren, wobei nur ein Kind gleichzeitig den Sprechstab haben kann. Stellen Sie nur sicher, dass Kinder normal fatale Signale behandeln, so dass sie am Leben bleiben, um das Schloss zu befreien.

    
Tim Post 16.02.2010 07:08
quelle

Tags und Links