老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

swoole_process有什么用

小編給大家分享一下swoole_process有什么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

成都創新互聯-專業網站定制、快速模板網站建設、高性價比臨澤網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式臨澤網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋臨澤地區。費用合理售后完善,十多年實體公司更值得信賴。

swoole

swoole 的進程之間有兩種通信方式,一種是消息隊列(queue),另一種是管道(pipe),對swoole_process 的研究在swoole中顯得尤為重要。

預備知識

IO多路復用

swoole 中的io多路復用表現為底層的 epoll進程模型,在C語言中表現為 epoll 函數。

epoll 模型下會持續監聽自己名下的素有socket 描述符 fd
當觸發了 socket 監聽的事件時,epoll 函數才會響應,并返回所有監聽該時間的 socket 集合
epoll 的本質是阻塞IO,它的優點在于能同事處理大量socket連接
Event loop 事件循環

swoole 對 epoll 實現了一個Reactor線程模型封裝,設置了read事件和write事件的監聽回調函數。(詳見swoole_event_add)

Event loop 是一個Reactor線程,其中運行了一個epoll實例。
通過swoole_event_add將socket描述符的一個事件添加到epoll監聽中,事件發生時將執行回調函數
不可用于fpm環境下,因為fpm在任務結束時可能會關掉進程。

swoole_process

基于C語言封裝的進程管理模塊,方便php來調用
內置管道、消息隊列接口,方便實現進程間通信
我們在php-fpm.conf配置文件中發現,php-fpm中有兩種進程池管理設置。

靜態模式 即初始化固定的進程數,當來了一個請求時,從中選取一個進程來處理。
動態模式 指定最小、最大進程數,當請求量過大,進程數不超過最大限制時,新增線程去處理請求

接下來用swoole代碼來實現,這里只是為理解swoole_process、進程間通信、定時器等使用,實際情況使用封裝好的swoole_server來實現task任務隊列池會更方便。

假如有個定時投遞的任務隊列:

pool = new swoole_process(function () {
      // 循環建立worker進程
      for ($i = 0; $i < $this->start_worker_num; $i++) {
        $this->createWorker();
      }
      echo '初始化進程數:' . $this->curr_num . PHP_EOL;
      // 每秒定時往閑置的worker的管道中投遞任務
      swoole_timer_tick(1000, function ($timer_id) {
        static $count = 0;
        $count++;
        $need_create = true;
        foreach ($this->used_workers as $pid => $used) {
          if ($used == 0) {
            $need_create = false;
            $this->workers[$pid]->write($count . ' job');
            // 標記使用中
            $this->used_workers[$pid] = 1;
            $this->active_time[$pid] = time();
            break;
          }
        }
        foreach ($this->used_workers as $pid => $used)
          // 如果所有worker隊列都沒有閑置的,則新建一個worker來處理
          if ($need_create && $this->curr_num < $this->max_woker_num) {
            $new_pid = $this->createWorker();
            $this->workers[$new_pid]->write($count . ' job');
            $this->used_workers[$new_pid] = 1;
            $this->active_time[$new_pid] = time();
          }

        // 閑置超過一段時間則銷毀進程
        foreach ($this->active_time as $pid => $timestamp) {
          if ((time() - $timestamp) > $this->idle_seconds && $this->curr_num > $this->min_woker_num) {
            // 銷毀該進程
            if (isset($this->workers[$pid]) && $this->workers[$pid] instanceof swoole_process) {
              $this->workers[$pid]->write('exit');
              unset($this->workers[$pid]);
              $this->curr_num = count($this->workers);
              unset($this->used_workers[$pid]);
              unset($this->active_time[$pid]);
              echo "{$pid} destroyed\n";
              break;
            }
          }
        }

        echo "任務{$count}/{$this->curr_num}\n";

        if ($count == 20) {
          foreach ($this->workers as $pid => $worker) {
            $worker->write('exit');
          }
          // 關閉定時器
          swoole_timer_clear($timer_id);
          // 退出進程池
          $this->pool->exit(0);
          exit();
        }
      });

    });

    $master_pid = $this->pool->start();
    echo "Master $master_pid start\n";

    while ($ret = swoole_process::wait()) {
      $pid = $ret['pid'];
      echo "process {$pid} existed\n";
    }
  }

  /**
   * 創建一個新進程
   * @return int 新進程的pid
   */
  public function createWorker()
  {
    $worker_process = new swoole_process(function (swoole_process $worker) {
      // 給子進程管道綁定事件
      swoole_event_add($worker->pipe, function ($pipe) use ($worker) {
        $data = trim($worker->read());
        if ($data == 'exit') {
          $worker->exit(0);
          exit();
        }
        echo "{$worker->pid} 正在處理 {$data}\n";
        sleep(5);
        // 返回結果,表示空閑
        $worker->write("complete");
      });
    });

    $worker_pid = $worker_process->start();

    // 給父進程管道綁定事件
    swoole_event_add($worker_process->pipe, function ($pipe) use ($worker_process) {
      $data = trim($worker_process->read());
      if ($data == 'complete') {
        // 標記為空閑//        echo "{$worker_process->pid} 空閑了\n";
        $this->used_workers[$worker_process->pid] = 0;
      }
    });

    // 保存process對象
    $this->workers[$worker_pid] = $worker_process;
    // 標記為空閑
    $this->used_workers[$worker_pid] = 0;
    $this->active_time[$worker_pid] = time();
    $this->curr_num = count($this->workers);
    return $worker_pid;
  }}new processPool();

看完了這篇文章,相信你對“swoole_process有什么用”有了一定的了解,如果想了解更多相關知識,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!


網站名稱:swoole_process有什么用
網頁鏈接:http://www.xueling.net.cn/article/jpsphs.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 天天摸夜夜操 | 18成禁人视频免费网站 | 日韩一区二区a片免费观看 法国性xxxx精品hd | 国产情侣久久久久aⅴ免费 日韩夜精品精品免费观看 日韩精品成人一区二区在线 | 259luxu在线观看 | 欧洲乱码专区网站 | 美美女高清毛片视频免费观看 | 欧美级特黄AAAAAA片 | 午夜亚洲国产理论片亚洲2020 | 美女裸体永久免费视频网站 | 国产日韩在线免费观看 | 国产无线乱码一区二三区 | 午夜看片网址 | 亚洲无人区码一码二码三码的含义 | 亚洲自偷观看高清久久 | 日本久久高清一区二区三区毛片 | 视频免费观看在线 | 国产91精品久久久久久久网曝门 | 黄色视网站| 天天干在线视频论坛 | 三年片在线观看免费视频 | 狠狠色噜噜狠狠狠狠888奇禾 | 精品成人久久 | 久久亚洲AV成人网站玖玖 | 色综合久久久无码中文字幕 | 精品xxxx户外露出视频 | 久久中文字 | 男女一级毛片 | av人摸人人人澡人人超碰小说 | 亚洲系列第一页 | 欧美第十页 | 国产白丝无码免费视频 | 狠狠干网址 | 成人午夜一区 | 久草在线视频免费播放 | 99热在线这里只有精品 | 国产一区二区在线影院 | AAA级黄色视频 | 久久精品人妻一区二区三区 | 成aⅴ人免费观看中文字幕 日韩一级黄色大片 | 久久久久精品无码专区 |