协程任务调度用PHP怎样做?
Admin 2021-05-12 群英技术资讯 1863 次浏览
很多新手对于任务调度不是很清楚,简单介绍一下,任务调度指的是根据一定的约束规定,将CPU分配给符合条件的任务使用。这篇文章给大家分享的是关于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任务调度的其他使用技巧,大家可以关注其他文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天小编就为大家分享一篇关于PDO::rollBack讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
PHP是获取哪些状态码来判断一个网站是否运行?相信很多编程人员都知道PHP能够获取一些状态码来判断网站是否正常运行,那么这些状态码都有哪些呢?下面给大家详细介绍分析:
这篇文章主要介绍了Yii2.0实现的批量更新及批量插入功能,结合实例形式总结分析了Yii2.0数据库实现数据的批量更新与批量插入功能相关操作技巧,需要的朋友可以参考下
这篇文章主要介绍了详解no input file specified 三种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
我们在刚学习编程的时候就要有好的编程习惯,而代码的编写很重要,对此本文就给大家分享一写简洁的php代码技巧,大家可以参考看看,希望对大家学习PHP有帮助。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008