PHPyangyi
  • 5
  • 新人请关照

swoole协程怎么按代码的执行顺序输出

swoole协程怎么按代码的执行顺序输出

阅读 535
评论 2019-08-16 提问
    4 个回答
    eechen
    • 15.1k

    手动用 Swoole\Coroutine::create(function(){}) 开启的多个协程,
    它们之间的通信需要使用 Swoole\Coroutine\Channel.

    var_export(get_class_methods('Swoole\Coroutine\Channel'));
    可见:
    array (
      0 => '__construct', // 通道默认容量为0,表示无缓冲区,push(生成)和pop(消费)操作会立即挂起当前协程.
      1 => '__destruct',
      2 => 'push', // 当队列中有其他协程正在等待pop(消费)数据时,push(生产)操作会自动按顺序唤醒一个消费者协程.当队列已满时自动yield(让出)控制器,等待其他协程pop(消费)数据.
      3 => 'pop', // 当队列为空时自动yield,等待其他协程push(生产)数据.pop(消费)数据后,队列可写入新的数据,自动按顺序唤醒一个生产者协程.
      4 => 'isEmpty', // 检测通道是否为空
      5 => 'isFull', // 检测通道是否已满
      6 => 'close', // 关闭通道,并唤醒所有等待读写的协程.
      7 => 'stats', // 包含信息queue_num(通道中的元素数量)和queue_bytes(通道当前占用的内存字节数).
      8 => 'length', // 通道中的队列长度,等价于 $chan->stats()['queue_num']
      9 => 'select', // 通道读写检测,类似于socket_select和stream_select.
    )

    对于一些协程客户端,可以直接使用顺序的写法:

    $redis = new Swoole\Coroutine\Redis();
    $redis->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT); // 发生协程切换
    $redis->set('key1', 'value'); // 发生协程切换
    评论 赞赏 2019-08-20