PHP实现简单的协程任务调度demo示例
发布:smiling 来源: PHP粉丝网 添加日期:2022-02-09 12:03:32 浏览: 评论:0
这篇文章主要介绍了PHP实现简单的协程任务调度demo,结合实例形式详细分析了PHP基于协程的任务调度基本原理、定义及使用技巧,需要的朋友可以参考下。
本文实例讲述了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.
Tags: PHP协程任务 demo
- 上一篇:PHP设计模式之组合模式定义与应用示例
- 下一篇:最后一页
相关文章
- ·微信公众平台DEMO(PHP)(2019-07-30)
- ·php实现基于微信公众平台开发SDK(demo)扩展的方法(2021-05-04)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)