SimpleFork php多程序併發框架
阿新 • • 發佈:2019-02-17
SimpleFork
基於PCNTL擴充套件的多程序程序併發框架,介面類似與Java的Thread和Runnable
為什麼要寫SimpleFork
多程序程式的編寫相比較多執行緒編寫更加複雜,需要考慮程序回收、同步、互斥、通訊等問題。對於初學者來說,處理上述問題會比較困難。 尤其是訊號處理和程序通訊這塊,很難做到不出問題。 SimpleFork提供一套類似於JAVA多執行緒的程序控制介面,提供回收、同步、互斥、通訊等方案,開發者可以關注業務問題,不需要過多考慮程序控制。
引入
composer require jenner/simple_fork
require path/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);
TODO
- 提供更多功能的程序池,模仿java
- 提供第三方程序通訊機制(Redis等)
- 更多的測試及示例程式
示例程式
更多示例程式見exmples目錄
simple.php
class TestRunnable extends \Jenner\SimpleFork\Runnable{ /** * 程序執行入口 * @return mixed */ public function run() { echo "I am a sub process" . PHP_EOL; } } $process = new \Jenner\SimpleFork\Process(new TestRunnable()); $process->start();
shared_memory.php
class Producer extends \Jenner\SimpleFork\Process{ public function run(){ for($i = 0; $i<10; $i++){ $this->cache->set($i, $i); echo "set {$i} : {$i}" . PHH_EOL; } } } class Worker extends \Jenner\SimpleFork\Process{ public function run(){ sleep(5); for($i=0; $i<10; $i++){ echo "get {$i} : " . $this->cache->get($i) . PHP_EOL; } } } $memory = new \Jenner\SimpleFork\IPC\SharedMemory(); $producer = new Producer(); $producer->setCache($memory); $worker = new Worker(); $worker->setCache($memory); $pool = new \Jenner\SimpleFork\Pool(); $pool->submit($producer); $pool->submit($worker); $pool->start(); $pool->wait();