php实现三个go协程的例子

  1. 超时处理

    <?php
    
    use Swow\Channel;
    use Swow\Coroutine;
    use Swow\Selector;
    
    $c1 = new Channel(1);
    Coroutine::run(function () use ($c1) {
     sleep(2);
     $c1->push('result 1');
    });
    
    $s = new Selector();
    $channel = $s->pop($c1)->pop(select_timeout(1))->commit();
    if ($channel === $c1) {
     echo $s->fetch(), PHP_EOL;
    } else {
     echo 'timeout 1', PHP_EOL;
    }
    
    $c2 = new Channel(1);
    Coroutine::run(function () use ($c2) {
     sleep(2);
     $c2->push('result 2');
    });
    
    $s = new Selector();
    $channel = $s->pop($c2)->pop(select_timeout(3))->commit();
    if ($channel === $c2) {
     echo $s->fetch(), PHP_EOL;
    } else {
     echo 'timeout 2', PHP_EOL;
    }
    
    function select_timeout(int $time): Channel
    {
     $chan = new Channel();
     Coroutine::run(function () use ($chan, $time) {
         sleep($time);
         $chan->push(true);
     });
     return $chan;
    }
  2. 非阻塞通道操作

    <?php
    
    use Swow\Channel;
    use Swow\Selector;
    
    $messages = new Channel();
    $signals = new Channel();
    
    $s = new Selector();
    $channel = $s->pop($messages)->pop(select_default())->commit();
    if ($channel === $messages) {
     echo 'received message: ' . $s->fetch(), PHP_EOL;
    } else {
     echo 'no message received', PHP_EOL;
    }
    
    $s = new Selector();
    $channel = $s->push($messages, 'hi')->pop(select_default())->commit();
    if ($channel === $messages) {
     echo 'sent message: ' . $messages->pop(), PHP_EOL;
    } else {
     echo 'no message sent', PHP_EOL;
    }
    
    $s = new Selector();
    $channel = $s->pop($messages)->pop($signals)->pop(select_default())->commit();
    if ($channel === $messages) {
     echo 'received message: ' . $s->fetch(), PHP_EOL;
    } elseif ($channel === $signals) {
     echo 'received signal: ' . $s->fetch(), PHP_EOL;
    } else {
     echo 'no activity', PHP_EOL;
    }
    
    function select_default(): Channel
    {
     $chan = new Channel(1);
     $chan->push(true);
     return $chan;
    }
  3. 通道的关闭

    <?php
    
    use Swow\Channel;
    use Swow\ChannelException;
    use Swow\Coroutine;
    
    $jobs = new Channel(5);
    $done = new Channel();
    Coroutine::run(function () use ($jobs, $done) {
     while(true) {
         try {
             $j = $jobs->pop();
             echo 'received job: ', $j, PHP_EOL;
         } catch (ChannelException) {
             echo 'received all jobs', PHP_EOL;
             $done->push(true);
             return;
         }
     }
    });
    for ($j = 1; $j <= 3; $j++) {
     echo 'sent job: ', $j, PHP_EOL;
     $jobs->push($j);
    }
    echo 'sent all jobs', PHP_EOL;
    $jobs->close();
    $done->pop();
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!