ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# Coroutine::create [TOC] 创建一个新的协程,并立即执行。 ~~~ function Swoole\Coroutine::create(callable $function, ...$args) : int|false; function go(callable $function, ...$args) : int|false; // 短名API ~~~ ## 参数 * `$function`协程执行的代码,必须为`callable`,系统能创建的协程总数量受限于`server->max_coroutine`设置 ## 返回值 * 创建失败返回`false` * 创建成功返回协程的`ID` 由于底层会优先执行子协程的代码,因此只有子协程挂起时,`Coroutine::create`才会返回,继续执行当前协程的代码。 在`2.1.0`或更高版本中如果开启了`swoole.use_shortname`,可以直接使用`go`关键词创建新的协程。 ~~~ go(function () { $db = new Co\MySQL(); $server = array( 'host' => '127.0.0.1', 'user' => 'root', 'password' => 'root', 'database' => 'test', ); $db->connect($server); $result = $db->query('SELECT * FROM userinfo WHERE id = 3'); var_dump($result); }); ~~~ ## 执行顺序 在一个协程中使用`go`嵌套创建新的协程。因为`Swoole`的协程是单线程模型,因此: * 使用`go`创建的子协程会优先执行,子协程执行完毕或挂起时,将重新回到父协程向下执行代码 * 如果子协程挂起后,父协程退出,不影响子协程的执行 ~~~ go(function() { go(function () { co::sleep(3.0); go(function () { co::sleep(2.0); echo "co[3] end\n"; }); echo "co[2] end\n"; }); co::sleep(1.0); echo "co[1] end\n"; }); ~~~ ## 协程开销 协程需要创建单独的内存栈,在`PHP-7.2`版本中底层会分配`8K`的`stack`来存储协程的变量,`zval`的尺寸为`16`字节,因此`8K`的`stack`最大可以保存`512`个变量。协程栈内存占用超过`8K`后`ZendVM`会自动扩容。 协程退出时会释放申请的`stack`内存。 > `PHP-7.1`、`PHP-7.0`默认会分配`256K`栈内存 > 可调用`Co::set(['stack_size' => 4096])`修改默认的栈内存尺寸