宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

Swoole的多進程模塊

管理 管理 編輯 刪除

0ca5d202309271138275786.png

Swoole是有自己的一個進程管理模塊,用來替代PHP的pcntl擴展,需要注意Process進程在系統(tǒng)是非常昂貴的資源,創(chuàng)建進程消耗很大,另外創(chuàng)建的進程過多會導(dǎo)致進程切換開銷大幅上升。

為什么不使用pcntl

1.pcntl沒有提供進程間通信的功能

2.pcntl不支持重定向標準輸入和輸出

3.pcntl只提供了fork這樣原始的接口,容易使用錯誤

Swoole是怎么解決的

1.swoole_process提供了基于unixsock的進程間通信,使用很簡單只需調(diào)用write/read或者push/pop即可

2.swoole_process支持重定向標準輸入和輸出,在子進程內(nèi)echo不會打印屏幕,而是寫入管道,讀鍵盤輸入可以重定向為管道讀取數(shù)據(jù)

3.swoole_process提供了exec接口,創(chuàng)建的進程可以執(zhí)行其他程序,與原PHP父進程之間可以方便的通信

創(chuàng)建進程

函數(shù)原型:

Swoole\Process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = true)

如果我們打印$process會發(fā)現(xiàn),每次創(chuàng)建一個進程后,就會隨之創(chuàng)建一個管道,主進程想和哪一個進程通信,就向那個進程的管道寫入/讀取數(shù)據(jù)。

管道有2個方法,分別來寫入數(shù)據(jù),和讀取數(shù)據(jù)。

  1. $process->write(‘?dāng)?shù)據(jù)’);#寫入數(shù)據(jù)
  2. $process->read()#讀取數(shù)據(jù)

管道通訊方式一:

$worker = [];
for ($i = 0; $i < 3; $i++) {
    $process = new Swoole\Process(function ($process) {
        var_dump('子進程:' . $process->read());
        sleep(1);
        $process->write('子進程數(shù)據(jù)');
        echo PHP_EOL . posix_getpid() . PHP_EOL;
    }, false, true);
    $pid = $process->start();
    $worker[$pid] = $process;//把相應(yīng)的進程放到同一個數(shù)組當(dāng)中
    $process->write('主進程數(shù)據(jù)');
//    var_dump($process->read());//同步阻塞
}
foreach ($worker as $w) {
    var_dump('主進程:' . $w->read());
}

管道通訊方式二:

for ($i = 0; $i < 3; $i++) {
    $process = new Swoole\Process(function ($process) {
        var_dump('子進程:' . $process->read());
        sleep(1);
        $process->write('子進程數(shù)據(jù)');
        echo PHP_EOL . posix_getpid() . PHP_EOL;
    }, false, true);
    $pid = $process->start();
    $process->write('主進程數(shù)據(jù)');
    // 異步監(jiān)聽管道中的數(shù)據(jù),讀事件監(jiān)聽,當(dāng)管道可讀時觸發(fā)
    swoole_event_add($process->pipe, function ($pipe) use ($process) {
        var_dump('主進程:' . $process->read());
    });
//    var_dump($process->read());//同步阻塞
}

消息隊列的通訊

消息隊列:

  1. 一系列保存在內(nèi)核中的消息鏈表
  2. 有一個 msgKey, 可以通過此訪問不同的消息隊列
  3. 有數(shù)據(jù)大小限制, 默認 8192
  4. 阻塞 vs 非阻塞: 阻塞模式下 pop()空消息隊列/push()滿消息隊列會阻塞, 非阻塞模式可以直接返回

swoole 中使用消息隊列:

  1. 通信模式: 默認為爭搶模式, 無法將消息投遞給指定子進程
  2. 新建消息隊列后, 主進程就可以使用
  3. 消息隊列不可和管道一起使用, 也無法使用 swoole     event loop

步驟:

1.啟用消息隊列作為進程間通信:

bool swoole_process->useQueue(int $msgkey = 0, int $mode = 2);

2.投遞數(shù)據(jù)到消息隊列中:

 bool swoole_process->push(string $data);

3.從隊列中提取數(shù)據(jù)

string swoole_process->pop(int $maxsize = 8192);

案例:

for ($i = 0; $i < 3; $i++) {
    $process = new Swoole\Process(function ($process) {
        var_dump('子進程:' . $process->pop());
//        $process->push('hello 主進程');#推送到主進程
    });
    $process->useQueue(1, 2 | swoole_process::IPC_NOWAIT);//啟用消息隊列,爭搶模式,非阻塞,可能會被任意一個子進程接收到
    $pid = $process->start();


    $process->push('hello 子進程');#推送到子進程,不能當(dāng)做管道使用
//    echo '主進程消息:' . $process->pop() . PHP_EOL;
}


請登錄后查看

CRMEB-慕白寒窗雪 最后編輯于2023-09-27 11:38:57

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認正序 回復(fù)倒序 點贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
1126
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動獲取的帖子內(nèi)容,不準確時需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認打賞

微信登錄/注冊

切換手機號登錄

{{ bind_phone ? '綁定手機' : '手機登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服