PHP实现简单的协程任务调度demo示例
时间:2020-02-03来源:电脑系统城作者:电脑系统城
本文实例讲述了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程序设计有所帮助。
相关信息
-
-
Laravel框架自定义分页样式操作示例
这篇文章主要介绍了Laravel框架自定义分页样式操作,结合实例形式详细分析了laravel框架自定义分页样式的具体操作步骤、实现方法及相关注意事项,需要的朋友可以参考下...
2020-02-03