久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      workerman如何實現(xiàn)異步任務(wù)(附代碼)

      workerman如何實現(xiàn)異步任務(wù)(附代碼)

      1、問題

      遇到一個問題,php是單線程,無法實現(xiàn)多線程?,F(xiàn)在我需要使用一個場景是多個鏈接使用一個線程,也就是在一個連接進程,再開進程來處理

      2、解決方案

      workerman如何實現(xiàn)異步任務(wù)。workerman可以幫我解決問題, 給予文檔一個解答

      問:

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

      答:

      可以在本機或者其它服務(wù)器甚至服務(wù)器集群預(yù)先建立一些任務(wù)進程處理繁重的業(yè)務(wù),任務(wù)進程數(shù)可以開多一些,例如cpu的10倍,然后調(diào)用方利用AsyncTcpConnection將數(shù)據(jù)異步發(fā)送給這些任務(wù)進程異步處理,異步得到處理結(jié)果

      任務(wù)進程服務(wù)端

      use WorkermanWorker; require_once __DIR__ . '/Workerman/Autoloader.php'; // task worker,使用Text協(xié)議 $task_worker = new Worker('Text://0.0.0.0:12345'); // task進程數(shù)可以根據(jù)需要多開一些 $task_worker->count = 100; $task_worker->name = 'TaskWorker'; //只有php7才支持task->reusePort,可以讓每個task進程均衡的接收任務(wù) //$task->reusePort = true; $task_worker->onMessage = function($connection, $task_data) {      // 假設(shè)發(fā)來的是json數(shù)據(jù)      $task_data = json_decode($task_data, true);      // 根據(jù)task_data處理相應(yīng)的任務(wù)邏輯.... 得到結(jié)果,這里省略....      $task_result = ......      // 發(fā)送結(jié)果      $connection->send(json_encode($task_result)); }; Worker::runAll();

      在workerman中調(diào)用

      use WorkermanWorker; use WorkermanConnectionAsyncTcpConnection; require_once __DIR__ . '/Workerman/Autoloader.php'; // websocket服務(wù) $worker = new Worker('websocket://0.0.0.0:8080'); $worker->onMessage = function($ws_connection, $message) {     // 與遠程task服務(wù)建立異步連接,ip為遠程task服務(wù)的ip,如果是本機就是127.0.0.1,如果是集群就是lvs的ip     $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');     // 任務(wù)及參數(shù)數(shù)據(jù)     $task_data = array(         'function' => 'send_mail',         'args'       => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'),     );     // 發(fā)送數(shù)據(jù)     $task_connection->send(json_encode($task_data));     // 異步獲得結(jié)果     $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection)     {          // 結(jié)果          var_dump($task_result);          // 獲得結(jié)果后記得關(guān)閉異步連接          $task_connection->close();          // 通知對應(yīng)的websocket客戶端任務(wù)完成          $ws_connection->send('task complete');     };     // 執(zhí)行異步連接     $task_connection->connect(); } Worker::runAll();

      這樣,繁重的任務(wù)交給本機或者其它服務(wù)器的進程去做,任務(wù)完成后會異步收到結(jié)果,業(yè)務(wù)進程就不會阻塞了。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號