PHP中怎么实现协程任务调度

发布时间:2021-07-26 14:27:31 作者:Leah
来源:亿速云 阅读:110

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.

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

推荐阅读:
  1. PHP7实现协程
  2. PHP中的协程是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:ThinkPHP5邮件发送服务封装的示例分析

下一篇:易语言发送消息模拟点击滚动条的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》