当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP实现简单的协程任务调度demo示例

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-09 12:03:32 浏览: 评论:0 

这篇文章主要介绍了PHP实现简单的协程任务调度demo,结合实例形式详细分析了PHP基于协程的任务调度基本原理、定义及使用技巧,需要的朋友可以参考下。

本文实例讲述了PHP实现简单的协程任务调度,分享给大家供大家参考,具体如下:

  1. <?php 
  2. class Task 
  3.   protected $taskId
  4.   protected $coroutine
  5.   protected $sendValue = null; 
  6.   protected $beforeFirstYield = true; 
  7.   public function __construct($taskId, Generator $coroutine
  8.   { 
  9.     $this->taskId = $taskId
  10.     $this->coroutine = $coroutine
  11.   } 
  12.   public function getTaskId() 
  13.   { 
  14.     return $this->taskId; 
  15.   } 
  16.   public function setSendValue($sendValue
  17.   { 
  18.     $this->sendValue = $sendValue
  19.   } 
  20.   public function run() 
  21.   { 
  22.     if ($this->beforeFirstYield) { 
  23.       $this->beforeFirstYield = false; 
  24.       return $this->coroutine->current(); 
  25.     } else { 
  26.       $retval = $this->coroutine->send($this->sendValue); 
  27.       $this->sendValue = null; 
  28.       return $retval
  29.     } 
  30.   } 
  31.   public function isFinished() 
  32.   { 
  33.     return !$this->coroutine->valid(); 
  34.   } 
  35. class Scheduler 
  36.   protected $maxTaskId = 0; 
  37.   protected $taskMap = []; // taskId => task 
  38.   protected $taskQueue
  39.   public function __construct() 
  40.   { 
  41.     $this->taskQueue = new SplQueue(); 
  42.   } 
  43.   public function newTask(Generator $coroutine
  44.   { 
  45.     $tid = ++$this->maxTaskId; 
  46.     $task = new Task($tid$coroutine); 
  47.     $this->taskMap[$tid] = $task
  48.     $this->schedule($task); 
  49.     return $tid
  50.   } 
  51.   public function schedule(Task $task
  52.   { 
  53.     $this->taskQueue->enqueue($task); 
  54.   } 
  55.   public function run() 
  56.   { 
  57.     while (!$this->taskQueue->isEmpty()) { 
  58.       $task = $this->taskQueue->dequeue(); 
  59.       $task->run(); 
  60.       if ($task->isFinished()) { 
  61.         unset($this->taskMap[$task->getTaskId()]); 
  62.       } else { 
  63.         $this->schedule($task); 
  64.       } 
  65.     } 
  66.   } 
  67. function task1() 
  68.   for ($i = 1; $i <= 10; ++$i) { 
  69.     echo "This is task 1 iteration $i.\n"
  70.     sleep(1); 
  71.     yield; 
  72.   } 
  73. function task2() 
  74.   for ($i = 1; $i <= 10; ++$i) { 
  75.     echo "This is task 2 iteration $i.\n"
  76.     sleep(1); 
  77.     yield; 
  78.   } 
  79. $scheduler = new Scheduler; 
  80. $scheduler->newTask(task1()); 
  81. $scheduler->newTask(task2()); 
  82. $scheduler->run(); 

运行结果:

  1. This is task 1 iteration 1. 
  2. This is task 1 iteration 2. 
  3. This is task 1 iteration 3. 
  4. This is task 1 iteration 4. 
  5. This is task 1 iteration 5. 
  6. This is task 1 iteration 6. 
  7. This is task 1 iteration 7. 
  8. This is task 1 iteration 8. 
  9. This is task 1 iteration 9. 
  10. This is task 1 iteration 10.

Tags: PHP协程任务 demo

分享到: