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 相关文章推荐
ip签名探针
Oct 09 PHP
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
php debug 安装技巧
Apr 30 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 PHP
跟我学Laravel之安装Laravel
Oct 15 PHP
php判断linux下程序问题实例
Jul 09 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
对laravel的session获取与存取方法详解
Oct 08 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如何编写易读的代码
2007/07/10 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
基于php 随机数的深入理解
2013/06/05 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
javascript Excel操作知识点
2009/04/24 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
护士演讲稿范文
2014/01/05 职场文书
婚礼新郎父母答谢词
2014/01/16 职场文书
留学推荐信写作指南
2014/01/25 职场文书
升国旗仪式主持词
2014/03/19 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
区域经理岗位职责
2015/02/02 职场文书
材料员岗位职责范本
2015/04/11 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技