协程 Channel

基于 Swoole 提供的 Swoole\Coroutine\Channel,直接在配置文件中设置,就可以在worker进程中使用,数据互通。

Swoole\Coroutine\Channel可以作为队列使用,支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。

配置方式

在项目配置文件中加入以下节

  1. 'coroutineChannels' => [
  2. // 定义名为name1的,通道占用的内存的尺寸为64kb
  3. // 当设置为0时,底层将不再设置缓冲区,push和pop操作会立即挂起当前协程。
  4. 'name1' => [64 * 1024],
  5. ],

使用方式

  1. use \Imi\Util\CoroutineChannelManager;
  2. // 获取 Swoole\Coroutine\Channel 对象
  3. $channel = CoroutineChannelManager::getInstance('name1');
  4. // 向队列中加入一个成员
  5. CoroutineChannelManager::push('name1', 'test');
  6. // 还支持数组,等一切可以被序列化的值
  7. CoroutineChannelManager::push('name1', [1, 2, 3]);
  8. // 弹出一个成员,如果没有值则为false
  9. $result = CoroutineChannelManager::pop('name1');
  10. // 获取通道的状态
  11. $result = CoroutineChannelManager::stats('name');
  12. /*
  13. $result 格式如下:
  14. [
  15. // 消费者数量,表示当前通道为空,有N个协程正在等待其他协程调用push方法生产数据
  16. 'consumer_num' => 1,
  17. // 生产者数量,表示当前通道已满,有N个协程正在等待其他协程调用pop方法消费数据
  18. 'producer_num' => 1,
  19. // 通道中的元素数量
  20. 'queue_num' => 10,
  21. // 通道当前占用的内存字节数
  22. 'queue_bytes' => 1024,
  23. ]
  24. */
  25. // 关闭通道。并唤醒所有等待读写的协程。
  26. CoroutineChannelManager::close('name1');