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 相关文章推荐
图书管理程序(一)
Oct 09 PHP
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
Jan 30 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
如何让CI框架支持service层
Oct 29 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
轻松实现php文件上传功能
Feb 17 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 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读取IMAP邮件
2006/10/09 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
Python之用户输入的实例
2018/06/22 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
学python爬虫能做什么
2020/07/29 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
机电专业大学生求职信
2013/10/04 职场文书
报到证丢失证明
2014/01/11 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android