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 相关文章推荐
用session做客户验证时的注意事项
Oct 09 PHP
PHP+MYSQL开发工具及资源收藏
Jan 02 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
php实现水仙花数示例分享
Apr 03 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP微信分享开发详解
Jan 14 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
PHP操作XML中XPath的应用示例
Jul 04 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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
E路文章系统PHP
2006/12/11 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
Python中的日期时间处理详解
2016/11/17 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
python3 反射的四种基本方法解析
2019/08/26 Python
日本无添加化妆品:HABA
2016/08/18 全球购物
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
精灵市场:Pixie Market
2019/06/18 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
实习护士自荐信
2014/06/21 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
九年级语文教学反思
2016/03/03 职场文书
浅谈MySQL中的六种日志
2022/03/23 MySQL