成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Swoole-2.1.2 進(jìn)程池模塊的使用

ZoomQuiet / 3189人閱讀

摘要:在版本中我們將的進(jìn)程管理模塊封裝成了類,現(xiàn)在可以在代碼中使用的進(jìn)程管理器了。提供的進(jìn)程管理器來自于,經(jīng)過大量生產(chǎn)項(xiàng)目驗(yàn)證,穩(wěn)定性和健壯性都非常高。三任務(wù)投遞進(jìn)程管理器自帶了消息隊(duì)列和消息投遞的支持。

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

在實(shí)際項(xiàng)目中經(jīng)常需要寫一些長(zhǎng)期運(yùn)行的腳本,如基于redis、kafka、rabbitmq實(shí)現(xiàn)的多進(jìn)程隊(duì)列消費(fèi)者,多進(jìn)程爬蟲等等。程序員需要使用pcntlposix相關(guān)的擴(kuò)展庫實(shí)現(xiàn)多進(jìn)程編程,需要開發(fā)者具備深厚的Linux系統(tǒng)編程功底,否則很容易出現(xiàn)問題。

Swoole提供的進(jìn)程管理器來自于SwooleServer,經(jīng)過大量生產(chǎn)項(xiàng)目驗(yàn)證,穩(wěn)定性和健壯性都非常高??纱蟠蠛?jiǎn)化多進(jìn)程腳本編程工作。

一、 創(chuàng)建進(jìn)程池

PHP代碼中使用new SwooleProcessPool即可創(chuàng)建一個(gè)進(jìn)程池,構(gòu)造方法的第一個(gè)參數(shù)傳入工作進(jìn)程的數(shù)量。使用on方法設(shè)置WorkerStart即可在工作進(jìn)程啟動(dòng)時(shí)執(zhí)行指定的代碼,可以在這里進(jìn)行while(true)循環(huán)從redis隊(duì)列中獲取任務(wù)并處理。使用start方法啟動(dòng)所有進(jìn)程,管理器開始進(jìn)入wait狀態(tài)。

$workerNum = 10;
$pool = new SwooleProcessPool($workerNum);

$pool->on("WorkerStart", function ($pool, $workerId) {
    echo "Worker#{$workerId} is started
";
    $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
";
});

$pool->start();

使用進(jìn)程管理器,可以保證工作進(jìn)程的穩(wěn)定性。

某個(gè)工作進(jìn)程遇到致命錯(cuò)誤、主動(dòng)退出時(shí)管理器會(huì)進(jìn)行回收,避免出現(xiàn)僵尸進(jìn)程

工作進(jìn)程退出后,管理器會(huì)自動(dòng)拉起、創(chuàng)建一個(gè)新的工作進(jìn)程

二、信號(hào)處理

Swoole進(jìn)程管理器自帶了信號(hào)處理,向管理器進(jìn)程發(fā)送:

SIGTERM信號(hào):中止服務(wù),向所有工作進(jìn)程發(fā)送SIGTERM關(guān)閉進(jìn)程

SIGUSR1信號(hào):重啟工作進(jìn)程,管理器會(huì)逐個(gè)重啟工作進(jìn)程

在工作進(jìn)程中可以配合使用pcntl_signalpcntl_signal_dispatch實(shí)現(xiàn)信號(hào)處理。

$pool->on("WorkerStart", function ($pool, $workerId) {
    $running = true;
    pcntl_signal(SIGTERM, function () use (&$running) {
        $running = false;
    });
    echo "Worker#{$workerId} is started
";
    $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);
     }
});
三、任務(wù)投遞

Swoole進(jìn)程管理器自帶了消息隊(duì)列和TCP-Socket消息投遞的支持??稍O(shè)置監(jiān)聽系統(tǒng)隊(duì)列或者TCP端口,接收任務(wù)數(shù)據(jù)。此項(xiàng)功能是可選的,要使用任務(wù)投遞功能,需要對(duì)進(jìn)程池對(duì)象設(shè)置onMessage回調(diào)。

消息隊(duì)列
$pool = new SwooleProcessPool(2, SWOOLE_IPC_MSGQUEUE, 0x7000001);

$pool->on("WorkerStart", function ($pool, $workerId) {
    echo "Worker#{$workerId} is started
";
});

$pool->on("Message", function ($pool, $message) {
    echo "Message: {$message}
";
});

$pool->start();

需要在構(gòu)造方法的第二個(gè)參數(shù)傳入SWOOLE_IPC_MSGQUEUE,第三個(gè)參數(shù)設(shè)置監(jiān)聽的消息隊(duì)列KEY。其他程序中使用消息隊(duì)列相關(guān)API就可以向工作進(jìn)程投遞任務(wù)了。

TCP 端口
$pool = new SwooleProcessPool(2, SWOOLE_IPC_SOCKET);

$pool->on("WorkerStart", function ($pool, $workerId) {
    echo "Worker#{$workerId} is started
";
});

$pool->on("Message", function ($pool, $message) {
    echo "Message: {$message}
";
});

$pool->listen("127.0.0.1", 8089);

$pool->start();

使用TCP端口監(jiān)聽,需要設(shè)置構(gòu)造方法的第二個(gè)參數(shù)為SWOOLE_IPC_SOCKET,并使用listen方法設(shè)置監(jiān)聽的主機(jī)和端口。

底層使用了4字節(jié)長(zhǎng)度+包體的協(xié)議。其他程序中向此端口發(fā)送數(shù)據(jù)時(shí),需要在數(shù)據(jù)包之前增加一個(gè)長(zhǎng)度字段。

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/28568.html

相關(guān)文章

  • 深入 Nginx 之架構(gòu)篇

    摘要:請(qǐng)求的多階段異步處理多階段異步處理請(qǐng)求與事件驅(qū)動(dòng)架構(gòu)是密切相關(guān)的,也就是說,請(qǐng)求的多階段異步處理只能基于事件驅(qū)動(dòng)架構(gòu)實(shí)現(xiàn)。 前言 最近在讀 Nginx 相關(guān)的書籍,做一下讀書筆記。 Nginx 作為業(yè)界知名的高性能服務(wù)器,被廣泛的應(yīng)用。它的高性能正是由于其優(yōu)秀的架構(gòu)設(shè)計(jì),其架構(gòu)主要包括這幾點(diǎn):模塊化設(shè)計(jì)、事件驅(qū)動(dòng)架構(gòu)、請(qǐng)求的多階段異步處理、管理進(jìn)程與多工作進(jìn)程設(shè)計(jì)、內(nèi)存池的設(shè)計(jì),以下內(nèi)...

    linkin 評(píng)論0 收藏0
  • 深入 Nginx 之架構(gòu)篇

    摘要:請(qǐng)求的多階段異步處理多階段異步處理請(qǐng)求與事件驅(qū)動(dòng)架構(gòu)是密切相關(guān)的,也就是說,請(qǐng)求的多階段異步處理只能基于事件驅(qū)動(dòng)架構(gòu)實(shí)現(xiàn)。 前言 最近在讀 Nginx 相關(guān)的書籍,做一下讀書筆記。 Nginx 作為業(yè)界知名的高性能服務(wù)器,被廣泛的應(yīng)用。它的高性能正是由于其優(yōu)秀的架構(gòu)設(shè)計(jì),其架構(gòu)主要包括這幾點(diǎn):模塊化設(shè)計(jì)、事件驅(qū)動(dòng)架構(gòu)、請(qǐng)求的多階段異步處理、管理進(jìn)程與多工作進(jìn)程設(shè)計(jì)、內(nèi)存池的設(shè)計(jì),以下內(nèi)...

    zhangrxiang 評(píng)論0 收藏0
  • 【暫時(shí)Over】Python 從零開始爬蟲(十)給爬蟲加速:多線程,多進(jìn)程

    摘要:限制同時(shí)運(yùn)行線程數(shù)使用類就行,在內(nèi)部管理著一個(gè)計(jì)數(shù)器。當(dāng)計(jì)數(shù)器到時(shí),再調(diào)用就會(huì)阻塞,直到其他線程來調(diào)用,這樣就限制了同時(shí)運(yùn)行線程的數(shù)量。 事前最好了解一下什么是進(jìn)程,什么是線程,什么是GIL,本文不再贅述,直接介紹模塊的使用: 推薦1,推薦2,推薦3,更多自尋 普通的python爬蟲是單進(jìn)程單線程的,這樣在遇到大量重復(fù)的操作時(shí)就只能逐個(gè)進(jìn)行,我們就很難過了。舉個(gè)栗子:你有1000個(gè)...

    wangdai 評(píng)論0 收藏0
  • Python

    摘要:最近看前端都展開了幾場(chǎng)而我大知乎最熱語言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標(biāo)準(zhǔn)庫為我們提供了模塊,它提供了和兩個(gè)類,實(shí)現(xiàn)了對(duì)和的進(jìn)一步抽象,對(duì)編寫線程池進(jìn)程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進(jìn)階的書, 里面介紹的基本都是高級(jí)的python用法. 對(duì)于初學(xué)python的人來說, 基礎(chǔ)大概也就夠用了...

    dailybird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<