搜尋
首頁php框架Workermanworkerman如何實現非同步任務(附程式碼)

workerman如何實現非同步任務(附程式碼)

Nov 23, 2019 pm 05:21 PM
workerman非同步任務

下面由workerman使用教學專欄來介紹workerman實現非同步任務的方法,希望對需要的朋友有幫助!

workerman如何實現非同步任務(附程式碼)

1、問題

#遇到一個問題,php是單線程,無法實作多線程。現在我需要使用一個場景是多個連結使用一個線程,也就是在一個連接進程,再開進程來處理

#2、解決方案 

workerman如何實現異步任務。 workerman可以幫我解決問題, 給予文件一個答案

問: 

如何非同步處理繁重的業務,避免主業務被長時間阻塞。例如我要給1000用戶發送郵件,這個過程很慢,可能要阻塞數秒,這個過程中因為主流程被阻塞,會影響後續的請求,如何將這樣的繁重任務交給其它進程異步處理。

答案: 

可以在本機或者其它伺服器甚至伺服器叢集預先建立一些任務進程處理繁重的業務,任務進程數可以開多一些,例如cpu的10倍,然後調用方利用AsyncTcpConnection將資料非同步傳送給這些任務進程非同步處理,非同步得到處理結果 

任務進程服務端

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();

#在workerman中呼叫

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();

這樣,繁重的任務交給本機或者其它伺服器的進程去做,任務完成後會異步收到結果,業務進程就不會阻塞了。

更多Workerman相關技術文章,請造訪Workerman教學欄位進行學習!

以上是workerman如何實現非同步任務(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具