PHP实现简单的协程任务调度demo示例

吾爱主题 阅读:93 2021-09-28 11:42:00 评论:0

本文实例讲述了PHP实现简单的协程任务调度。分享给大家供大家参考,具体如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 <?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程序设计有所帮助。

原文链接:https://blog.csdn.net/qq_22640823/article/details/103596953

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容