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 相关文章推荐
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
Mar 19 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
YII框架行为behaviors用法示例
Apr 26 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
写给女生的道歉信
2014/01/08 职场文书
公务员职业生涯规划书范文  
2014/01/19 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
教师业务培训方案
2014/05/01 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
刑事撤诉申请书
2015/05/18 职场文书
读书笔记怎么写
2015/07/01 职场文书
爱国主题班会教案
2015/08/14 职场文书