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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。