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 相关文章推荐
phpwind中的数据库操作类
Jan 02 PHP
php去除重复字的实现代码
Sep 16 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
PHP MSSQL 分页实例
Apr 13 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 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
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
关于跨站脚本攻击问题
2011/12/22 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
python实现批量改文件名称的方法
2015/05/25 Python
python2.7的编码问题与解决方法
2016/10/04 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
Python爬取网页信息的示例
2020/09/24 Python
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
小学毕业演讲稿
2014/04/25 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技
python如何为list实现find方法
2022/05/30 Python
mysql sql常用语句大全
2022/06/21 MySQL
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技