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 相关文章推荐
一个用于MySQL的PHP XML类
Oct 09 PHP
对javascript和select部件的结合运用
Oct 09 PHP
用PHP实现的随机广告显示代码
Jun 14 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
Nov 07 PHP
Laravel 4 初级教程之安装及入门
Oct 30 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
php实现基于PDO的预处理示例
Mar 28 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 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/11/16 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
优化Python代码使其加快作用域内的查找
2015/03/30 Python
Python格式化日期时间操作示例
2018/06/28 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
美国家居装饰店:Pier 1
2019/09/04 全球购物
药学专业大学生个人的自我评价
2013/11/04 职场文书
四年级数学教学反思
2014/02/02 职场文书
安全生产月演讲稿
2014/05/09 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
python flappy bird小游戏分步实现流程
2022/02/15 Python
Java设计模式中的命令模式
2022/04/28 Java/Android