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来检测proxy
Oct 09 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
ThinkPHP中order()使用方法详解
Apr 19 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
php数据库操作model类(使用__call方法)
Nov 16 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 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之第三天
2006/10/09 PHP
做一个有下拉功能的留言版
2006/10/09 PHP
PHP setcookie() cannot modify header information 的解决方法
2009/01/09 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
Python创建xml文件示例
2017/03/22 Python
python实现聚类算法原理
2018/02/12 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
戴森美国官网:Dyson美国
2016/09/11 全球购物
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
益模软件Java笔试题
2012/03/27 面试题
党校自我鉴定范文
2013/10/02 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
委托公证书
2014/04/08 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python
Redis keys命令的具体使用
2022/06/05 Redis