Heim  >  Artikel  >  PHP-Framework  >  Wie verwende ich den Aufgabenprozess in Swoole, um zeitaufwändige Aufgaben zu erledigen?

Wie verwende ich den Aufgabenprozess in Swoole, um zeitaufwändige Aufgaben zu erledigen?

angryTom
angryTomnach vorne
2020-01-27 21:49:592248Durchsuche

Dieser Artikel stellt die Methode zur Verwendung des Aufgabenprozesses in Swoole zur Bewältigung zeitaufwändiger Aufgaben vor. Ich hoffe, dass er für Schüler, die das Swoole-Framework erlernen, hilfreich sein wird.

Wie verwende ich den Aufgabenprozess in Swoole, um zeitaufwändige Aufgaben zu erledigen?

Wie verwende ich den Aufgabenprozess in Swoole, um zeitaufwändige Aufgaben zu erledigen?

Wir wissen, dass es in Swoole zwei Hauptprozesse gibt, nämlich den Master-Hauptprozess und den Manager-Managementprozess.

Der Master-Hauptprozess verfügt über einen Hauptreaktor-Thread und mehrere Reaktor-Threads. Die Hauptfunktion besteht darin, TCP-Verbindungen aufrechtzuerhalten, Netzwerk-E/A zu verarbeiten und Daten zu senden und zu empfangen.

Der Manager verwaltet Prozesse und seine Aufgabe besteht darin, Arbeits- und Aufgabenprozesse aufzuteilen und zu verwalten.

Die Funktion des Arbeitsprozesses besteht darin, die vom Reaktor-Thread übergebenen Daten zu empfangen, die Daten zu verarbeiten und die Verarbeitungsergebnisse an den Reaktor-Thread zurückzugeben.

Die Aufgabe des Task-Prozesses besteht darin, einige relativ zeitaufwändige Aufgaben zu erledigen. Der Task-Prozess ist unabhängig vom Worker-Prozess und hat keinen Einfluss auf die Verarbeitung von Client-Anfragen durch den Worker-Prozess.

1. Anwendungsszenarien des Aufgabenprozesses:

1. Relativ zeitaufwendiger Massenmailing, wie z. B. ein bestimmtes Ereignis, das den Versand von Ereignis-E-Mails an 1 Million Benutzer erfordert .

2. Pushen Sie die Updates bestimmter großer Vs. Wenn beispielsweise ein großes V eine neue Nachricht postet, müssen die Fans die Updates rechtzeitig erhalten.

Empfohlenes Lernen: Swoole-Tutorial

2. Die Beziehung zwischen Arbeitern und Aufgaben:

1 im Arbeitsprozess Die Aufgabe wird durch Aufrufen von task () zugestellt, und der Aufgabenprozess antwortet über das onTask-Ereignis auf die zugestellte Aufgabe.

2. Kehren Sie im Aufgabenprozess direkt zurück oder rufen Sie finish() auf, um dem Arbeitsprozess mitzuteilen, dass die Aufgabe abgeschlossen ist. Im Arbeitsprozess reagiert das Ereignis onFinish auf den Abschluss der Aufgabe.

3. Voraussetzungen für die Verwendung von Task:

1. Konfigurieren Sie die Anzahl der task_worker_num im Server.

2. Legen Sie die Ereignisrückruffunktionen onTask und onFinish des Servers fest.

Ein einfaches Beispiel für die Verwendung von task zur Berechnung der kumulativen Summe

<?php
 
$server = new swoole_server(&#39;0.0.0.0&#39;, 6666);
 
$server->set([
    &#39;worker_num&#39; => 2,
    &#39;task_worker_num&#39; => 16,
]);
 
$server->on(&#39;WorkerStart&#39;, function ($server, $worker_id) {
    //注意这里,我们通过taskworker来判断是task进程还是worker进程
    //需要在worker进程中调用task(),不然会报出警告
    //这里会执行两遍,因为我们设置了worker_num数为2
    if (!$server->taskworker) {
        echo &#39;投递任务开始...&#39;, PHP_EOL;
        //投递32个累加计算任务给16个task进程
        for ($ix = 0; $ix < 32; $ix++) {
            //注意这里的投递是异步的
            $server->task([mt_rand(1, 100), mt_rand(1000, 9999)]);
        }
        echo &#39;投递任务结束...&#39;, PHP_EOL;
    }
});
 
//server服务必须要有onReceive回调
$server->on(&#39;Receive&#39;, function ($server, $fd, $reactor_id, $data) {
 
});
 
//注意,task进程完全是同步阻塞模式的
$server->on(&#39;Task&#39;, function ($server, $task_id, $src_worker_id, $data) {
    echo "task {$task_id} 进程正在工作...", PHP_EOL;
    $start = $data[0];
    $end = $data[1];
    $total = 0;
    for (; $start <= $end; $start++) {
        $total += $start;
    }
    echo "task {$task_id} 进程完成工作...", PHP_EOL;
    return $total;
});
 
$server->on(&#39;Finish&#39;, function ($server, $task_id, $data) {
    echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL;
});
 
$server->start();

Beachten Sie, dass wir Aufgaben an den Task-Pool übergeben, indem wir task() und swoole aufrufen Die unterste Ebene übernimmt abwechselnd die Abfragezustellungsaufgabe für jeden Aufgabenprozess.

Wenn die Anzahl der von Ihnen gelieferten Aufgaben die Verarbeitungsgeschwindigkeit von onTask überschreitet, wird der Aufgabenpool gefüllt, wodurch der Arbeitsprozess blockiert wird, sodass die Beziehung zwischen der Anzahl von task_worker_num und Die Verarbeitungsgeschwindigkeit muss entsprechend eingestellt werden.

Natürlich können wir die Aufgabe auch manuell an den angegebenen Aufgabenprozess übergeben. Der zweite Parameter der Funktion task() kann die zuzustellende Task-Prozess-ID angeben. Der ID-Bereich liegt zwischen 0 und (task_worker_num - 1).

5. Segmentieren Sie die Aufgabe und steuern Sie die Zustellung an den Aufgabenprozess manuell

rrree

Das obige ist der detaillierte Inhalt vonWie verwende ich den Aufgabenprozess in Swoole, um zeitaufwändige Aufgaben zu erledigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen