日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swoole-2.1.2 进程池模块的使用

發布時間:2024/9/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swoole-2.1.2 进程池模块的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在?Swoole-2.1.2?
版本中我們將?Server?
的?進程?管理?模塊封裝成了?PHP?
類,現在可以在?PHP?
代碼?中使用?Swoole?
的進程管理器了。

在實際項目中經常需要寫一些長期運行的腳本,如基于?redis?
、?kafka?
、?rabbitmq?
實現的多進程隊列消費者,多進程爬蟲等等。?程序員?需要使用?pcntl?
和?posix?
相關的擴展庫實現多進程編程,需要?開發者?具備深厚的?Linux?
系統編程功底,否則很容易出現問題。

Swoole?
提供的進程管理器來自于?Swoole/Server?
,經過大量生產項目驗證,穩定性和健壯性都非常高。可大大簡化多進程腳本編程工作。

一、 創建進程池

在?PHP?
代碼中使用?new?Swoole/Process/Pool?
即可創建一個進程池,構造方法的第一個?參數?傳入工作進程的數量。使用?on?
方法設置?WorkerS?tar?t?
即可在工作進程啟動時執行指定的代碼,可以在這里進行?while(true)?
循環從?redis?
隊列中獲取任務并處理。使用?start?
方法啟動所有進程,管理器開始進入?wait?
狀態。

$workerNum = 10; $pool = new Swoole/Process/Pool($workerNum);$pool->on("WorkerStart", function ($pool, $workerId) {echo "Worker#{$workerId} is started/n";$redis = new Redis();$redis->pconnect('127.0.0.1', 6379);$key = "key1";while (true) {$msgs = $redis->brpop($key, 2);if ( $msgs == null) continue;var_dump($msgs);} });$pool->on("WorkerStop", function ($pool, $workerId) {echo "Worker#{$workerId} is stopped/n"; });$pool->start();

使用進程管理器,可以保證工作進程的穩定性。

  • 某個工作進程遇到致命錯誤、主動退出時管理器會進行回收,避免出現僵尸進程
  • 工作進程退出后,管理器會自動拉起、創建一個新的工作進程

二、信號處理

Swoole?
進程管理器自帶了信號處理,向管理器進程發送:

  • SIGTERM?
    信號:中止服務,向所有工作進程發送?SIGTERM?
    關閉進程
  • SIGUSR1?
    信號:重啟工作進程,管理器會逐個重啟工作進程

在工作進程中可以配合使用?pcntl_signal?
和?pcntl_signal_dispatch?
實現信號處理。

$pool->on("WorkerStart", function ($pool, $workerId) {$running = true;pcntl_signal(SIGTERM, function () use (&$running) {$running = false;});echo "Worker#{$workerId} is started/n";$redis = new Redis();$redis->pconnect('127.0.0.1', 6379);$key = "key1";while ($running) {$msgs = $redis->brpop($key, 2);pcntl_signal_dispatch();if ( $msgs == null) continue;var_dump($msgs);} });

三、任務投遞

Swoole?
進程管理器自帶了?消息隊列?和?TCP?-Socket?
消息投遞的支持。可設置監聽系統隊列或者?TCP?
端口?,接收任務?數據?。此項功能是可選的,要使用任務投遞功能,需要對進程池對象設置?onMessage?
回調。

消息隊列

$pool = new Swoole/Process/Pool(2, SWOOLE_IPC_MSGQUEUE, 0x7000001);$pool->on("Message", function ($pool, $message) {echo "Message: {$message}/n"; });$pool->start();

需要在構造方法的第二個參數傳入?SWOOLE_IPC_MSGQUEUE?
,第三個參數設置監聽的消息隊列?KEY?
。其他程序中使用消息隊列相關?API?
就可以向工作進程投遞任務了。

TCP 端口

$pool = new Swoole/Process/Pool(2, SWOOLE_IPC_SOCKET); $pool->on("Message", function ($pool, $message) {echo "Message: {$message}/n"; }); $pool->listen('127.0.0.1', 8089); $pool->start();

使用?TCP?
端口監聽,需要設置構造方法的第二個參數為?SWOOLE_IPC_SOCKET?
,并使用?listen?
方法設置監聽的?主機?和端口。

底層使用了?4?
字節長度+包體的?協議?。其他程序中向此端口發送數據時,需要在數據包之前增加一個長度字段。

$fp = stream_socket_client("tcp://127.0.0.1:8089", $errno, $errstr) or die("error: $errstr/n"); $msg = json_encode(['data' => 'hello', 'uid' => 1991]); fwrite($fp, pack('N', strlen($msg)).$msg); fclose($fp);

原文

https?://segmentfault.com/a/1190000014303621

本站部分文章源于互聯網,本著傳播知識、有益學習和研究的目的進行的轉載,為網友免費提供。如有著作權人或出版方提出異議,本站將立即刪除。如果您對文章轉載有任何疑問請告之我們,以便我們及時糾正。?PS:如果您想和業內技術大牛交流的話,請加qq群(474807195)或者關注微信公眾號(AskHarries),謝謝!

轉載請注明原文出處:?Harries Blog????Swoole-2.1.2 進程池模塊的使用

來源:http://ju.outofmemory.cn/entry/350679

總結

以上是生活随笔為你收集整理的Swoole-2.1.2 进程池模块的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。