Coroutine::getCid

获取当前协程的唯一ID, 它的别名为getUid, 是一个进程内唯一的正整数

  1. function \Swoole\Coroutine::getCid() : int

仅在当前进程内唯一

返回值

  • 成功时返回当前协程ID(int)
  • 如果当前不在协程环境中,则返回-1
  1. echo Swoole\Coroutine::getCid();

cid分配机制

在v4.2.9中, cid分配机制从有限的cidmap+静态表更改为unordered_map, 底层的cid改为long类型, 分配方式为自增, 在PHP中最大值为PHP_INT_MAX, 在64位机器上其大小为9223372036854775807, 几乎不存在重复的可能性, 可以作为真正的unique id而无需考虑cid在进程内的可能重复的问题.

cid分配机制 (v4.2.8及以下版本)

相关issue

如在v4.2.8及以下版本使用cid作为上下文存储主键, 而在协程退出时没有妥善清除上下文, cid的复用(创建超过52万个协程后)可能会导致协程上下文错乱

cid map 使用了 bit map, 它在分配时总是会寻找下一个可用的比特位

我们可以通过以下代码来确认这个事实:

  1. co::set([
  2. 'max_coroutine' => PHP_INT_MAX,
  3. 'log_level' => SWOOLE_LOG_INFO,
  4. 'trace_flags' => 0
  5. ]);
  6. $map = [];
  7. while (true) {
  8. if (empty($map)){
  9. $cid = go(function () {co::sleep(5);});
  10. }else{
  11. $cid = go(function () { });
  12. }
  13. if (!isset($map[$cid])) {
  14. $map[$cid] = $cid;
  15. } else {
  16. var_dump(end($map));
  17. var_dump($cid);
  18. exit;
  19. }
  20. }

它将会打印:

  1. int(524288)
  2. int(2)

所以我们有 MAX_CORO_NUM_LIMIT => 0x80000 则在同一时间同一进程的协程数也不能超过 524288

虽然它的分配数量存在上限, 但这个数值非常大, 一个进程不可能同时存在这么多协程, 除非你有一台超大内存的机器, 但那时候你也不必再担心这个问题