PHP實(shí)現(xiàn)簡單的協(xié)程任務(wù)調(diào)度demo示例
本文實(shí)例講述了PHP實(shí)現(xiàn)簡單的協(xié)程任務(wù)調(diào)度。分享給大家供大家參考,具體如下:
<?php class Task { protected $taskId; protected $coroutine; protected $sendValue = null; protected $beforeFirstYield = true; public function __construct($taskId, Generator $coroutine) { $this->taskId = $taskId; $this->coroutine = $coroutine; } public function getTaskId() { return $this->taskId; } public function setSendValue($sendValue) { $this->sendValue = $sendValue; } public function run() { if ($this->beforeFirstYield) { $this->beforeFirstYield = false; return $this->coroutine->current(); } else { $retval = $this->coroutine->send($this->sendValue); $this->sendValue = null; return $retval; } } public function isFinished() { return !$this->coroutine->valid(); } } class Scheduler { protected $maxTaskId = 0; protected $taskMap = []; // taskId => task protected $taskQueue; public function __construct() { $this->taskQueue = new SplQueue(); } public function newTask(Generator $coroutine) { $tid = ++$this->maxTaskId; $task = new Task($tid, $coroutine); $this->taskMap[$tid] = $task; $this->schedule($task); return $tid; } public function schedule(Task $task) { $this->taskQueue->enqueue($task); } public function run() { while (!$this->taskQueue->isEmpty()) { $task = $this->taskQueue->dequeue(); $task->run(); if ($task->isFinished()) { unset($this->taskMap[$task->getTaskId()]); } else { $this->schedule($task); } } } } function task1() { for ($i = 1; $i <= 10; ++$i) { echo "This is task 1 iteration $i.\n"; sleep(1); yield; } } function task2() { for ($i = 1; $i <= 10; ++$i) { echo "This is task 2 iteration $i.\n"; sleep(1); yield; } } $scheduler = new Scheduler; $scheduler->newTask(task1()); $scheduler->newTask(task2()); $scheduler->run();
運(yùn)行結(jié)果:
This is task 1 iteration 1.
This is task 1 iteration 2.
This is task 1 iteration 3.
This is task 1 iteration 4.
This is task 1 iteration 5.
This is task 1 iteration 6.
This is task 1 iteration 7.
This is task 1 iteration 8.
This is task 1 iteration 9.
This is task 1 iteration 10.
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP進(jìn)程與線程操作技巧總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。
- php使用gearman進(jìn)行任務(wù)分發(fā)操作實(shí)例詳解
- python基于json文件實(shí)現(xiàn)的gearman任務(wù)自動重啟代碼實(shí)例
- PHP并發(fā)多進(jìn)程處理利器Gearman使用介紹
- Gearman::XS在Centos下的編譯安裝方法
- gearman隊(duì)列持久化引發(fā)的問題及解決方法
- gearman的安裝啟動及python API使用實(shí)例
- rhel5.7下安裝gearmand及啟動的方法
- PHP 進(jìn)程池與輪詢調(diào)度算法實(shí)現(xiàn)多任務(wù)的示例代碼
- PHP 多進(jìn)程與信號中斷實(shí)現(xiàn)多任務(wù)常駐內(nèi)存管理實(shí)例方法
- php解決crontab定時任務(wù)不能寫入文件問題的方法分析
- gearman管理工具GearmanManager的安裝與php使用方法示例
相關(guān)文章
PHP實(shí)現(xiàn)基數(shù)排序的方法詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)基數(shù)排序的方法,結(jié)合實(shí)例形式分析了基數(shù)排序的原理、實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-12-12PHP使用ActiveMQ實(shí)現(xiàn)消息隊(duì)列的方法詳解
這篇文章主要介紹了PHP使用ActiveMQ實(shí)現(xiàn)消息隊(duì)列的方法,結(jié)合實(shí)例形式詳細(xì)分析了PHP使用ActiveMQ實(shí)現(xiàn)消息隊(duì)列具體步驟、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-05-05php和javascript之間變量的傳遞實(shí)現(xiàn)代碼
本文提供一種解決php和javascript之間變量的傳遞的方法,需要的朋友可以參考下2012-12-12redis+php實(shí)現(xiàn)微博(三)微博列表功能詳解
這篇文章主要介紹了redis+php實(shí)現(xiàn)微博列表功能,結(jié)合實(shí)例形式分析了php+redis獲取微博關(guān)注人列表及微博發(fā)布信息列表的相關(guān)操作技巧,需要的朋友可以參考下2019-09-09