Maison > cadre php > Workerman > le corps du texte

Comment Workman implémente des tâches asynchrones (avec du code)

angryTom
Libérer: 2019-11-26 14:24:53
avant
4377 Les gens l'ont consulté

La colonne suivante du tutoriel d'utilisation de Workerman vous présentera la méthode de Workingerman pour mettre en œuvre des tâches asynchrones. J'espère qu'elle sera utile aux amis qui en ont besoin !

Comment Workman implémente des tâches asynchrones (avec du code)

1. Problème

J'ai rencontré un problème avec un seul thread et ne peut pas réaliser de multi-thread. filetage. Maintenant, je dois utiliser un scénario dans lequel plusieurs liens utilisent un seul thread, c'est-à-dire dans un seul processus de connexion, puis ouvrir le processus pour gérer

Solution

. Que diriez-vous de Workerman Implémentez des tâches asynchrones. Workerman peut m'aider à résoudre le problème et donner une réponse au document

Q :

Comment traiter des affaires lourdes de manière asynchrone pour éviter que l'activité principale ne soit bloquée pendant une longue période. Par exemple, je souhaite envoyer des e-mails à 1 000 utilisateurs. Ce processus est très lent et peut être bloqué pendant plusieurs secondes. Étant donné que le processus principal est bloqué pendant ce processus, cela affectera les demandes ultérieures. d'autres processus pour le traitement asynchrone.

Réponse :

Vous pouvez pré-établir certains processus de tâches sur cette machine ou sur d'autres serveurs ou même des clusters de serveurs pour gérer des tâches lourdes. Le nombre de processus de tâches peut être augmenté, par exemple, 10. fois le processeur, puis appelez La partie utilise AsyncTcpConnection pour envoyer de manière asynchrone des données à ces processus de tâche pour un traitement asynchrone et obtenir les résultats du traitement de manière asynchrone

Serveur de processus de tâche

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();
Copier après la connexion

Appel à Workererman

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();
Copier après la connexion

De cette façon, les tâches lourdes sont transférées au processus de la machine locale ou d'autres serveurs. Une fois la tâche terminée, les résultats seront reçus de manière asynchrone, et le processus commercial ne sera pas bloqué.

Pour plus d'articles techniques liés à Workerman, veuillez visiter la colonne Tutoriel Workerman pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!