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 XML error parsing SOAP payload on line 1
Jun 17 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
php学习之function的用法
Jul 14 PHP
有关PHP性能优化的介绍
Jun 20 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
php查看当前Session的ID实例
Mar 16 PHP
PHP生成plist数据的方法
Jun 16 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 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
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
javascript操作cookie
2017/01/17 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
JS实现简易日历效果
2021/01/25 Javascript
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
给实习单位的感谢信
2014/02/01 职场文书
酒店管理求职信范文
2014/04/06 职场文书
淘宝好评语大全
2014/05/05 职场文书
毕业生自荐信范文
2015/03/05 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书