• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现简单的协程任务调度demo示例

    本文实例讲述了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网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • php使用gearman进行任务分发操作实例详解
    • python基于json文件实现的gearman任务自动重启代码实例
    • PHP并发多进程处理利器Gearman使用介绍
    • Gearman::XS在Centos下的编译安装方法
    • gearman队列持久化引发的问题及解决方法
    • gearman的安装启动及python API使用实例
    • rhel5.7下安装gearmand及启动的方法
    • PHP 进程池与轮询调度算法实现多任务的示例代码
    • PHP 多进程与信号中断实现多任务常驻内存管理实例方法
    • php解决crontab定时任务不能写入文件问题的方法分析
    • gearman管理工具GearmanManager的安装与php使用方法示例
    上一篇:PHP设计模式之组合模式定义与应用示例
    下一篇:php封装的page分页类完整实例代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP实现简单的协程任务调度demo示例 PHP,实现,简单,的,协程,任务,