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中动态HTML的输出技术
Oct 09 PHP
基于mysql的论坛(4)
Oct 09 PHP
php获取mysql版本的几种方法小结
Mar 25 PHP
防止MySQL注入或HTML表单滥用的PHP程序
Jan 21 PHP
php使用websocket示例详解
Mar 12 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
PHP递归实现层级树状展开
Apr 01 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
php可变长参数处理函数详解
Feb 22 PHP
PHP通过文件路径获取文件名的实例代码
Oct 14 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php中session与cookie的比较
2015/01/27 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
详解Python中的__new__()方法的使用
2015/04/09 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
Python中zip函数如何使用
2020/06/04 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
护士自荐信范文
2013/12/15 职场文书
廉洁自律承诺书
2014/03/27 职场文书
一年级学生期末评语
2014/04/21 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
撤诉状格式范本
2015/05/19 职场文书
python简单验证码识别的实现过程
2021/06/20 Python
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB