首页 > 开发 > PHP > 正文

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

2024-05-04 22:53:12
字体:
来源:转载
供稿:网友

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

<?phpclass 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();

运行结果:

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.

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表