溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是swoft2進程

發(fā)布時間:2021-10-11 09:54:35 來源:億速云 閱讀:150 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“什么是swoft2進程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是swoft2進程”吧!

基本功能介紹

  1. swoft2 自定義用戶進程來定期執(zhí)行用戶自定義任務

  2. swoft2 支持進程池解決多進程并發(fā)執(zhí)行用戶自定義任務

進程和線程的介紹   https://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

多進程程序設計能解決很多有意義的問題,程序的主進程運行核心任務,一些輔助進程解決一些例如消息隊列的處理,后臺定期執(zhí)行的任務處理,文件監(jiān)控,定期日志上報等相關(guān)功能.每個進程都有獨立的上下文,進程之間互不干擾.

功能的相關(guān)配置選項

  1. 用戶進程的配置一般需要在 bean.php 里注冊,系統(tǒng)會自動加載用戶配置的自定義進程

  2. 進程池的配置也需要在 bean.php 配置進程池配置項,但進程池不會自動加載,需要手動執(zhí)行命令來啟動用戶進程

用戶進程配置簡單示例

修改 bean.php
 'httpServer' => [
 'class' => HttpServer::class,
 'port' => 18306,
 'listener' => [
 'rpc' => bean('rpcServer')
 ],
 'process' => [
 'crontab' => bean(CrontabProcess::class)
 'log' => bean(\App\Process\LogProcess::class)
 ],
 ],

上面的配置是 WEB服務器 的應用配置 如果是 WebSocket服務器 寫在wsServer配置項里,定義 process 屬性就好.

注意process的值是一維數(shù)組,其中key你可以自己定義,只要合法且不重復即可,值則為你定義的進程類,請用工廠函數(shù) bean 加載.

進程池的配置簡單示例

修改 bean.php
'processPool' => [
 'class' => \Swoft\Process\ProcessPool::class,
 'workerNum' => 12
]

上面的配置定了進程池,且分配了12個可用工作進程,實際生產(chǎn)中根據(jù)你的項目需求自行修改配置項.

進程 workerid 的初始值是0,所以這里的 workerid 有效訪問是0-11,請注意

簡單的示例

用戶進程代碼預覽

namespace App\Process;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Log\Helper\CLog;
use Swoole\Coroutine;
use Throwable;
use Swoft\Process\Process;
use Swoft\Process\UserProcess;

/**
 * Class LogProcess
 *
 * @since 2.0
 *
 * @Bean()
 */
class LogProcess extends UserProcess
{

 /**
     * @param Process $process
     *
     * @throws Throwable
     */
 public function run(Process $process): void
 {
           $process->name('swoft-monitor'); //設置用戶進程名

 while (true) {

 CLog::info('用戶進程,每隔3秒輸出一次');//需要處理的工作
 Coroutine::sleep(3);//休眠3秒
 }
 }
  • 注意事項

  1. 自定義進程類需要打上 Bean 注解

  2. 用自定義進程類必須繼承 Swoft\Process\UserProcess

  3. 用戶自定義進程類的 run 方法是具體的任務執(zhí)行代碼

  4. 用戶進程需要while循環(huán)來防止進程執(zhí)行完畢后退出

  5. 休眠函數(shù)請使用 Coroutine::sleep(3) 參數(shù)根據(jù)項目實際情況配置,單位是秒.支持傳小數(shù),如果傳入?yún)?shù)0.5,則代表每 500ms 執(zhí)行一次

  6. 在run方法里不使用 while(true) 而使用 \Swoft\Timer::tick ,也是可以的,但tick更多的用于解決周期性任務,該函數(shù)需要維護更多的調(diào)用棧,并且觸發(fā) swoft 的內(nèi)置事件,所以它更消耗性能,一般在執(zhí)行頻率要求不高的場景下使用,如果一些執(zhí)行頻率較高的任務推薦使用 while(true)

控制臺打印

什么是swoft2進程

進程池代碼預覽

namespace App\Process;

use Swoft\Log\Helper\CLog;
use Swoft\Process\Annotation\Mapping\Process;
use Swoft\Process\Contract\ProcessInterface;
use Swoole\Coroutine;
use Swoole\Process\Pool;
use Throwable;

/**
 * Class Worker2Process
 *
 * @since 2.0
 *
 * @Process(workerId={0,1})
 */
class Worker2Process implements ProcessInterface
{
 /**
     * @param Pool $pool
     * @param int  $workerId
     *
     * @throws Throwable
     */
 public function run(Pool $pool, int $workerId): void
 {
 while (true) {
 CLog::info('worker-' . $workerId.' context='.context()->getWorkerId());
 Coroutine::sleep(3);
 }
 }
}
  • 注意事項

  1. 進程池進程類需要打上 Process 注解 且參數(shù)是 workerId 值為分配的進程池work進程的id數(shù)組.

  2. 進程池進程類需要實現(xiàn) Swoft\Process\Contract\ProcessInterface 接口.

  3. 進程池 Process 注解的 workerId 不是越多越好,需要根據(jù)你的需要設置,設置的越多占用的內(nèi)存越多.

  4. 每個 workerid 只允許分配一次,如果分配多個系統(tǒng)會拋出異常.

  5. workerid的取值范圍是 0 到 bean.php 配置的 workerNum-1 本文的例子是 0-11

啟動說明

前臺啟用進程

php bin/swoft process:start

后臺啟動進程

php bin/swoft process:start -d

重啟所有 worker 進程

php bin/swoft process:reload

重新啟動

php bin/swoft process:restart

停止服務

php bin/swoft process:stop

控制臺打印

到此,相信大家對“什么是swoft2進程”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI