SimpleFork php多進程並發架構

來源:互聯網
上載者:User
SimpleFork

項目地址:https://github.com/huyanping/simple-fork-php

基於PCNTL擴充的多進程進程並發架構,介面類似與Java的Thread和Runnable

為什麼要寫SimpleFork

多進程程式的編寫相比較多線程編寫更加複雜,需要考慮進程回收、同步、互斥、通訊等問題。對於初學者來說,處理上述問題會比較困難。 尤其是訊號處理和進程通訊這塊,很難做到不出問題。 SimpleFork提供一套類似於JAVA多線程的進程式控制制介面,提供回收、同步、互斥、通訊等方案,開發人員可以關注業務問題,不需要過多考慮進程式控制制。

引入

composer require jenner/simple_fork

requirepath/to/SimpleFork/autoload.php

依賴

必須

  • ext-pcntl 進程式控制制
  • 可選

  • ext-sysvmsg 訊息佇列
  • ext-sysvsem 同步互斥鎖
  • ext-sysvshm 共用記憶體
  • 特性

  • 提供進程池
  • 自動處理殭屍進程回收,支援無阻塞調用
  • 提供共用記憶體、System V 訊息佇列、Semaphore鎖,方便IPC通訊(進程通訊)
  • 提供Process和Runnable兩種方式實現進程
  • 可以即時擷取到進程狀態
  • shutdown所有進程或單獨stop一個進程時,可以註冊覆蓋beforeExit()方法,返回true則退出,false繼續運行(在某些情境,進程不能立即退出)
  • 支援子進程運行時reload
  • 注意事項

  • System V 訊息佇列由於在程式退出時可能存在尚未處理完的資料,所以不會銷毀。如果需要銷毀,請調用$queue->remove()方法刪除隊列
  • 共用記憶體會在所有進程退出後刪除
  • Semaphore對象會在對象回收時進行銷毀
  • 進程池start()後,需要調用wait()進行殭屍進程回收,可以無阻塞調用
  • 擷取進程狀態(調用isAlive()方法)前,最好調用一個無阻塞的wait(false)進行一次回收,由於進程運行狀態的判斷不是原子操作,所以isAlive()方法不保證與實際狀態完全一致
  • 如果你不清楚在什麼情況下需要在程式的最開始加入declare(ticks=1);,那麼最好預設第一行都加入這段聲明。
  • 如何使用declare(ticks=1);

  • declare(ticks=1); 這段聲明用於進程訊號處理。如果註冊了訊號處理器,程式會沒執行一行代碼後自動檢查是否有尚未處理的訊號。http://php.net/manual/zh/control-structures.declare.php
  • TODO

  • 提供更多功能的進程池,模仿java
  • 提供第三方進程通訊機制(Redis等)
  • 更多的測試及樣本程式
  • 樣本程式

    更多樣本程式見exmples目錄

    simple.php

    classTestRunnableextends\Jenner\SimpleFork\Runnable{/** * 進程執行入口 * @return mixed */publicfunctionrun() {echo"I am a sub process".PHP_EOL; }}$process=new\Jenner\SimpleFork\Process(newTestRunnable());$process->start();

    shared_memory.php

    classProducerextends\Jenner\SimpleFork\Process{publicfunctionrun(){for($i=0; $i<10; $i++){$this->cache->set($i, $i);echo"set {$i} : {$i}".PHH_EOL; } }}classWorkerextends\Jenner\SimpleFork\Process{publicfunctionrun(){sleep(5);for($i=0; $i<10; $i++){echo"get {$i} : ".$this->cache->get($i) .PHP_EOL; } }}$memory=new\Jenner\SimpleFork\IPC\SharedMemory();$producer=newProducer();$producer->setCache($memory);$worker=newWorker();$worker->setCache($memory);$pool=new\Jenner\SimpleFork\Pool();$pool->submit($producer);$pool->submit($worker);$pool->start();$pool->wait();

    原創文章,轉載請註明: 轉載自始終不夠

    本文連結地址: SimpleFork php多進程並發架構

    轉載請註明:始終不夠 ? SimpleFork php多進程並發架構

    以上就介紹了SimpleFork php多進程並發架構,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.