Heim > PHP-Framework > Workerman > Hauptteil

Wie Workerman asynchrone Aufgaben implementiert (mit Code)

angryTom
Freigeben: 2019-11-26 14:24:53
nach vorne
4400 Leute haben es durchsucht

Die folgende Spalte des Tutorials zur Workerman-Nutzung wird Ihnen die Methode des Workerman zum Implementieren asynchroner Aufgaben vorstellen. Ich hoffe, dass sie Freunden, die sie benötigen, hilfreich sein wird!

Wie Workerman asynchrone Aufgaben implementiert (mit Code)

1. Problem

PHP ist Single-Threaded und kann keine Multi-Threaded-Funktionalität erreichen. Einfädeln. Jetzt muss ich ein Szenario verwenden, in dem mehrere Links einen Thread verwenden, also in einem Verbindungsprozess, und dann den Prozess öffnen, um

Lösung

zu verarbeiten Wie wäre es mit Workerman? Implementieren Sie asynchrone Aufgaben. Workerman kann mir bei der Lösung des Problems helfen und eine Antwort auf das Dokument geben

F:

Wie man schwere Geschäfte asynchron verarbeitet, um zu vermeiden, dass das Hauptgeschäft für längere Zeit blockiert wird. Ich möchte beispielsweise E-Mails an 1.000 Benutzer senden. Da der Hauptprozess während dieses Vorgangs blockiert ist, wirkt sich dies auf nachfolgende Anfragen aus andere Prozesse zur asynchronen Verarbeitung.

Antwort:

Sie können einige Aufgabenprozesse auf diesem Computer oder anderen Servern oder sogar Serverclustern vorab einrichten, um schwere Aufgaben abzuwickeln. Die Anzahl der Aufgabenprozesse kann beispielsweise auf 10 erhöht werden mal die CPU und dann anrufen Die Partei verwendet AsyncTcpConnection, um asynchron Daten an diese Task-Prozesse zur asynchronen Verarbeitung zu senden und die Verarbeitungsergebnisse asynchron zu erhalten

Task-Prozessserver

use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// task worker,使用Text协议
$task_worker = new Worker('Text://0.0.0.0:12345');
// task进程数可以根据需要多开一些
$task_worker->count = 100;
$task_worker->name = 'TaskWorker';
//只有php7才支持task->reusePort,可以让每个task进程均衡的接收任务
//$task->reusePort = true;
$task_worker->onMessage = function($connection, $task_data)
{
     // 假设发来的是json数据
     $task_data = json_decode($task_data, true);
     // 根据task_data处理相应的任务逻辑.... 得到结果,这里省略....
     $task_result = ......
     // 发送结果
     $connection->send(json_encode($task_result));
};
Worker::runAll();
Nach dem Login kopieren

Arbeiter anrufen

use Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/Workerman/Autoloader.php';
// websocket服务
$worker = new Worker('websocket://0.0.0.0:8080');
$worker->onMessage = function($ws_connection, $message)
{
    // 与远程task服务建立异步连接,ip为远程task服务的ip,如果是本机就是127.0.0.1,如果是集群就是lvs的ip
    $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');
    // 任务及参数数据
    $task_data = array(
        'function' => 'send_mail',
        'args'       => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'),
    );
    // 发送数据
    $task_connection->send(json_encode($task_data));
    // 异步获得结果
    $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection)
    {
         // 结果
         var_dump($task_result);
         // 获得结果后记得关闭异步连接
         $task_connection->close();
         // 通知对应的websocket客户端任务完成
         $ws_connection->send('task complete');
    };
    // 执行异步连接
    $task_connection->connect();
}
Worker::runAll();
Nach dem Login kopieren

Auf diese Weise werden schwere Aufgaben an den Prozess des lokalen Computers oder anderer Server übergeben. Nach Abschluss der Aufgabe werden die Ergebnisse asynchron empfangen. und der Geschäftsprozess wird nicht blockiert.

Weitere technische Artikel zum Thema Workerman finden Sie in der Spalte Workerman-Tutorial, um mehr darüber zu erfahren!

Das obige ist der detaillierte Inhalt vonWie Workerman asynchrone Aufgaben implementiert (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage