协程任务调度用PHP怎样做?
Admin 2021-05-12 群英技术资讯 2092 次浏览
很多新手对于任务调度不是很清楚,简单介绍一下,任务调度指的是根据一定的约束规定,将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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
PHP中static变量有何用途,怎样应用呢?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
在thinkphp中,T方法用于生成模板文件名,语法“T([资源://][模块@][主题/][控制器/]操作,[视图分层])”;该方法的返回值是一个完整的模板文件名,可以直接用于display和fetch方法进行渲染输出。
正如标题所述,本文主要内容是给大家介绍比较两个指定日期的三种方法!假设我们给定两个日期(date1 和 date2),当两个日期的格式相同时,在 PHP 中比较这两个日期是很简单的,但是当两个日期的格式不同时就会出现一些问题。
下面由phpstorm教程栏目给大家介绍解决phpStorm使用vue提示"Attribute v-xxx is not allowed here"的方法,希望对需要的朋友有所帮助!
在本部分,你将了解 PHP5 的目录函数:Directory 函数。有不少朋友对此感兴趣,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
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核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008