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
使用dump函数,给php加断点测试
Jun 25 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP 超级全局变量相关总结
Jun 30 PHP
php实现简易计算器
Aug 28 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 PHP
利用ajax+php实现商品价格计算
Mar 31 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
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
玩转方法:call和apply
2014/05/08 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
js中new一个对象的过程
2017/02/20 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
python内存管理机制原理详解
2019/08/12 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
车间主管岗位职责
2013/11/14 职场文书
翻译专业应届生求职信
2013/11/23 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
工作时间上网检讨书
2014/02/03 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js