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 相关文章推荐
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 PHP
php 获取本地IP代码
Jun 23 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
php中的mongodb select常用操作代码示例
Sep 06 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
详解PHP中的外观模式facade pattern
Feb 05 PHP
PDO::errorCode讲解
Jan 28 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 和 XML: 使用expat函数(一)
2006/10/09 PHP
生成静态页面的PHP类
2006/11/25 PHP
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
PHP常用的小程序代码段
2015/11/14 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
让焦点自动跳转
2006/07/01 Javascript
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
JavaScript自定义数组排序方法
2015/02/12 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
谈谈JavaScript数组常用方法总结
2017/01/24 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
python删除列表中重复记录的方法
2015/04/28 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
英智兴达软件测试笔试题
2016/10/12 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
谢师宴家长答谢词
2015/09/30 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
Python实现天气查询软件
2021/06/07 Python