PHP实现简单的协程任务调度demo示例
本文实例讲述了PHP实现简单的协程任务调度。分享给大家供大家参考,具体如下:
taskId=$taskId;
$this->coroutine=$coroutine;
}
publicfunctiongetTaskId()
{
return$this->taskId;
}
publicfunctionsetSendValue($sendValue)
{
$this->sendValue=$sendValue;
}
publicfunctionrun()
{
if($this->beforeFirstYield){
$this->beforeFirstYield=false;
return$this->coroutine->current();
}else{
$retval=$this->coroutine->send($this->sendValue);
$this->sendValue=null;
return$retval;
}
}
publicfunctionisFinished()
{
return!$this->coroutine->valid();
}
}
classScheduler
{
protected$maxTaskId=0;
protected$taskMap=[];//taskId=>task
protected$taskQueue;
publicfunction__construct()
{
$this->taskQueue=newSplQueue();
}
publicfunctionnewTask(Generator$coroutine)
{
$tid=++$this->maxTaskId;
$task=newTask($tid,$coroutine);
$this->taskMap[$tid]=$task;
$this->schedule($task);
return$tid;
}
publicfunctionschedule(Task$task)
{
$this->taskQueue->enqueue($task);
}
publicfunctionrun()
{
while(!$this->taskQueue->isEmpty()){
$task=$this->taskQueue->dequeue();
$task->run();
if($task->isFinished()){
unset($this->taskMap[$task->getTaskId()]);
}else{
$this->schedule($task);
}
}
}
}
functiontask1()
{
for($i=1;$i<=10;++$i){
echo"Thisistask1iteration$i.\n";
sleep(1);
yield;
}
}
functiontask2()
{
for($i=1;$i<=10;++$i){
echo"Thisistask2iteration$i.\n";
sleep(1);
yield;
}
}
$scheduler=newScheduler;
$scheduler->newTask(task1());
$scheduler->newTask(task2());
$scheduler->run();
运行结果:
Thisistask1iteration1.
Thisistask1iteration2.
Thisistask1iteration3.
Thisistask1iteration4.
Thisistask1iteration5.
Thisistask1iteration6.
Thisistask1iteration7.
Thisistask1iteration8.
Thisistask1iteration9.
Thisistask1iteration10.
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。