最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP swoole的process模塊創(chuàng)建和使用子進程操作示例

 更新時間:2020年03月11日 12:48:01   作者:懷素真  
這篇文章主要介紹了PHP swoole的process模塊創(chuàng)建和使用子進程操作,結(jié)合實例形式分析了swoole的進程管理process模塊實現(xiàn)進程間通信相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了PHP swoole的process模塊創(chuàng)建和使用子進程操作。分享給大家供大家參考,具體如下:

swoole中為我們提供了一個進程管理模塊 Process,替換PHP的 pcntl 擴展,方便我們創(chuàng)建進程,管理進程,和進程間的通信。

swoole提供了2種進程間的通信:

1、基于 unix socket 的管道 pipe。

2、基于 sysvmsg 的消息隊列。

我們可以通過 new swoole_process() 快速的創(chuàng)建一個進程,默認會創(chuàng)建一個 SOCK_DGRAM 類型的管道,用于進程間的通信,當然可以設(shè)置成其他類型,也可以不創(chuàng)建。

一、通過同步阻塞管道進行進程間通信

<?php
$worker_process_nums = 5;
$worker_process = [];
 
for ($i = 0; $i < $worker_process_nums; $i++) {
  //創(chuàng)建子進程
  //默認為每個子進程創(chuàng)建一個管道,如果不想創(chuàng)建設(shè)置$pipe_type參數(shù)為false
  //注意管道默認是同步阻塞,半雙工,如果讀取不到數(shù)據(jù)就會阻塞
  $worker = new swoole_process(function (swoole_process $worker) {
    //注意,如果主進程中不寫數(shù)據(jù)write(),那么子進程這里read()就會阻塞
    $task = json_decode($worker->read(), true);
 
    //進行計算任務(wù)
    $tmp = 0;
    for ($i = $task['start']; $i < $task['end']; $i++) {
      $tmp += $i;
    }
 
    echo '子進程 PID : ', $worker->pid, ' 計算 ', $task['start'], ' - ', $task['end'], ' 結(jié)果 : ', $tmp, PHP_EOL;
    //往管道中寫入計算的結(jié)果
    $worker->write($tmp);
    //子進程退出
    $worker->exit();
  });
 
  //保存子進程
  $worker_process[$i] = $worker;
 
  //啟動子進程
  $worker->start();
}
 
//往每個子進程管道中投遞任務(wù)
for ($i = 0; $i < $worker_process_nums; $i++) {
  $worker_process[$i]->write(json_encode([
    'start' => mt_rand(1, 10),
    'end' => mt_rand(50, 100),
  ]));
}
 
//父進程監(jiān)聽子進程退出信號,回收子進程,防止出現(xiàn)僵尸進程
swoole_process::signal(SIGCHLD, function ($sig) {
  //必須為false,非阻塞模式
  while ($ret = swoole_process::wait(false)) {
    echo "子進程 PID : {$ret['pid']} 退出\n";
  }
});

二、通過 swoole_event_add 將管道設(shè)為異步,來進行通信

<?php
$worker_process_nums = 5;
$worker_process = [];
 
for ($i = 0; $i < $worker_process_nums; $i++) {
  $worker = new swoole_process(function ($worker) {
    //在子進程中給管道添加事件監(jiān)聽
    //底層會自動將該管道設(shè)置為非阻塞模式
    //參數(shù)二,是可讀事件回調(diào)函數(shù),表示管道可以讀了
    swoole_event_add($worker->pipe, function ($pipe) use ($worker) {
      $task = json_decode($worker->read(), true);
 
      $tmp = 0;
      for ($i = $task['start']; $i < $task['end']; $i++) {
        $tmp += $i;
      }
      echo "子進程 : {$worker->pid} 計算 {$task['start']} - {$task['end']} \n";
      //子進程把計算的結(jié)果,寫入管道
      $worker->write($tmp);
      //注意,swoole_event_add與swoole_event_del要成對使用
      swoole_event_del($worker->pipe);
      //退出子進程
      $worker->exit();
    });
  });
 
  $worker_process[$i] = $worker;
 
  //啟動子進程
  $worker->start();
}
 
for ($i = 0; $i < $worker_process_nums; $i++) {
  $worker = $worker_process[$i];
 
  $worker->write(json_encode([
    'start' => mt_rand(1, 10),
    'end' => mt_rand(50, 100),
  ]));
 
  //主進程中,監(jiān)聽子進程管道事件
  swoole_event_add($worker->pipe, function ($pipe) use ($worker) {
    $result = $worker->read();
    echo "子進程 : {$worker->pid} 計算結(jié)果 {$result} \n";
    swoole_event_del($worker->pipe);
  });
}
 
//父進程監(jiān)聽子進程退出信號,回收子進程,防止出現(xiàn)僵尸進程
swoole_process::signal(SIGCHLD, function ($sig) {
  //必須為false,非阻塞模式
  while ($ret = swoole_process::wait(false)) {
    echo "子進程 PID : {$ret['pid']} 退出\n";
  }
});

三、使用消息隊列來完成進程間通信

<?php
$worker_process_nums = 5;
$worker_process = [];
 
for ($i = 0; $i < $worker_process_nums; $i++) {
  //注意,這里將參數(shù)$pipe_type設(shè)為false,表示不創(chuàng)建管道
  $worker = new swoole_process(function ($worker) {
    $task = json_decode($worker->pop(), true);
 
    $tmp = 0;
    for ($i = $task['start']; $i < $task['end']; $i++) {
      $tmp += $i;
    }
    echo "子進程 : {$worker->pid} 計算 {$task['start']} - {$task['end']} \n";
    $worker->push($tmp);
    $worker->exit();
  }, false, false);
 
  //使用消息隊列,作為進程間的通信
  //注意,消息隊列是共享的
  $worker->useQueue();
 
  $worker_process[$i] = $worker;
 
  //啟動子進程
  $worker->start();
}
 
for ($i = 0; $i < $worker_process_nums; $i++) {
  //只需用一個子進程發(fā)送消息即可,因為消息隊列是共享的
  $worker_process[0]->push(json_encode([
    'start' => mt_rand(1, 10),
    'end' => mt_rand(50, 100),
  ]));
}
 
//注意,這里要暫停,防止加入隊列的任務(wù),立刻被主進程讀出來。
sleep(1);
 
for ($i = 0; $i < $worker_process_nums; $i++) {
  $result = $worker_process[0]->pop();
  echo "計算結(jié)果 : {$result} \n";
}
 
//父進程監(jiān)聽子進程退出信號,回收子進程,防止出現(xiàn)僵尸進程
swoole_process::signal(SIGCHLD, function ($sig) {
  //必須為false,非阻塞模式
  while ($ret = swoole_process::wait(false)) {
    echo "子進程 PID : {$ret['pid']} 退出\n";
  }
});

四、進程可以通過 signal 監(jiān)聽信號,和 alarm 設(shè)置定時器。

我們可以在父進程上設(shè)置監(jiān)聽信號,當子進程退出時,重新掛起子進程。

也可以設(shè)置定時器,通過 swoole_process::kill($pid, 0); 定時檢測進程是否存活。

<?php
//每隔1秒觸發(fā)SIGALAM信號
//注意,alarm不能和Timer同時使用
swoole_process::alarm(1000 * 1000, 0);
 
swoole_process::signal(SIGALRM, function ($signo) {
  static $cnt = 0;
  $cnt++;
  echo "時鐘定時信號\n";
 
  if ($cnt > 10) {
    //清除定時器
    swoole_process::alarm(-1);
  }
});
 
swoole_process::signal(SIGINT, function ($signo) {
  echo "我被ctrl+c了\n";
 
  //退出主進程,不然將一直無法正常退出
  exit(0);
});

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php socket用法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》及《php程序設(shè)計算法總結(jié)

希望本文所述對大家PHP程序設(shè)計有所幫助。

相關(guān)文章

  • 一個PHP數(shù)組應(yīng)該有多大的分析

    一個PHP數(shù)組應(yīng)該有多大的分析

    PHP在數(shù)組處理上非常低效,尤其是內(nèi)存占用較多,常常使得httpd進程消耗太多資源。
    2009-07-07
  • str_replace只替換一次字符串的方法

    str_replace只替換一次字符串的方法

    我們都知道,在PHP里Strtr,strreplace等函數(shù)都可以用來替換,不過他們每次替換的時候都是全部替換,但是如果你想只替換一個或兩個怎么辦呢?看下邊的解決方法
    2013-04-04
  • 淺談PDO的rowCount函數(shù)

    淺談PDO的rowCount函數(shù)

    這篇文章主要介紹了淺談PDO的rowCount函數(shù)的相關(guān)使用方法和效率問題,需要的朋友可以參考下
    2015-06-06
  • php使用socket簡單實現(xiàn)通信功能

    php使用socket簡單實現(xiàn)通信功能

    socket只不過是一個數(shù)據(jù)結(jié)構(gòu)。使用這個socket數(shù)據(jù)結(jié)構(gòu)去開始一個客戶端和服務(wù)器之間的會話。服務(wù)器是一直在監(jiān)聽準備產(chǎn)生一個新的會話。當一個客戶端連接服務(wù)器,它就打開服務(wù)器正在進行監(jiān)聽的一個端口進行會話
    2023-03-03
  • 用PHP實現(xiàn)的四則運算表達式計算實現(xiàn)代碼

    用PHP實現(xiàn)的四則運算表達式計算實現(xiàn)代碼

    題目要求:有一個四則運算的字符串表達式,編寫一個函數(shù),計算四則運算的結(jié)果
    2011-08-08
  • PHP實現(xiàn)二維數(shù)組根據(jù)key進行排序

    PHP實現(xiàn)二維數(shù)組根據(jù)key進行排序

    這篇文章主要介紹了PHP實現(xiàn)二維數(shù)組根據(jù)key進行排序,在PHP中內(nèi)置了很多對數(shù)組進行處理的函數(shù),有很多時候我們直接使用其內(nèi)置函數(shù)就能達到我們的需求,得到我們所想要的結(jié)果,需要的朋友可以參考下
    2023-10-10
  • php繪制一條直線的方法

    php繪制一條直線的方法

    這篇文章主要介紹了php繪制一條直線的方法,主要涉及GD庫中imageline方法的使用技巧,需要的朋友可以參考下
    2015-01-01
  • php實現(xiàn)將base64格式圖片保存在指定目錄的方法

    php實現(xiàn)將base64格式圖片保存在指定目錄的方法

    這篇文章主要介紹了php實現(xiàn)將base64格式圖片保存在指定目錄的方法,涉及php針對圖片文件的傳輸、判定及轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2016-10-10
  • PHP策略模式定義與用法示例

    PHP策略模式定義與用法示例

    這篇文章主要介紹了PHP策略模式定義與用法,結(jié)合實例形式簡單分析了php策略模式的原理、實現(xiàn)與使用方法,需要的朋友可以參考下
    2017-07-07
  • PHP中strtr與str_replace函數(shù)運行性能簡單測試示例

    PHP中strtr與str_replace函數(shù)運行性能簡單測試示例

    這篇文章主要介紹了PHP中strtr與str_replace函數(shù)運行性能簡單測試,結(jié)合具體實例形式對比分析了PHP中strtr與str_replace函數(shù)的測試運行效率,需要的朋友可以參考下
    2019-06-06

最新評論

渝北区| 垣曲县| 武宁县| 多伦县| 仙游县| 丰城市| 邵阳县| 海丰县| 唐山市| 新营市| 苗栗县| 扎囊县| 凌云县| 太仓市| 阳原县| 南宁市| 政和县| 黄骅市| 大邑县| 莱阳市| 行唐县| 宝兴县| 呼玛县| 长顺县| 芜湖市| 荔波县| 东辽县| 台东市| 衡阳县| 驻马店市| 会同县| 晋城| 双柏县| 江山市| 荔浦县| 乌鲁木齐市| 和政县| 绥江县| 巴彦县| 卢氏县| 翁牛特旗|