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


Posted in PHP onFebruary 01, 2020

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

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

运行结果:

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中设置多级目录session的问题
Aug 08 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
php动态函数调用方法
May 21 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
Jan 09 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
PHP进程通信基础之信号
Feb 19 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 #PHP
php实现的简单多进程服务器类完整示例
Feb 01 #PHP
laravel 框架执行流程与原理简单分析
Feb 01 #PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 #PHP
php正则表达式使用方法整理集合
Jan 31 #PHP
laravel邮件发送的实现代码示例
Jan 31 #PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 #PHP
You might like
DSP接收机前端设想
2021/03/02 无线电
PHP 多维数组排序实现代码
2009/08/05 PHP
paypal即时到账php实现代码
2010/11/28 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
一个收集图片的bookmarlet(js 刷新页面中的图片)
2010/05/27 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
2012/09/19 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
ios中视频的最后一桢问题解决
2019/05/14 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
python正则分组的应用
2013/11/10 Python
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
python中zip()方法应用实例分析
2016/04/16 Python
python操作 hbase 数据的方法
2016/12/18 Python
Python中表示字符串的三种方法
2017/09/06 Python
python实现k-means聚类算法
2018/02/23 Python
python write无法写入文件的解决方法
2019/01/23 Python
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
指针和引用有什么区别
2013/01/13 面试题
Java基础知识面试题
2014/03/25 面试题
项目副经理岗位职责
2013/12/30 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
环保倡议书300字
2014/05/15 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
2014年食堂工作总结
2014/11/20 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
php去除deprecated的实例方法
2021/11/17 PHP