本节专门介绍swoole提供的协程机制中核心的API
类方法:
1) set():协程设置,设置协程相关选项。
Swoole\Coroutine::set(array $options);

2) getOptions():获取设置的协程相关选项。
Swoole\Coroutine::getOptions(): null|array;
3) create():创建一个新的协程,并立即执行。
Swoole\Coroutine::create(callable $function, ...$args): int|false go(callable $function, ...$args): int|false // 参考php.ini的use_shortname配置
$function:协程执行的代码,必须为 callable,系统能创建的协程总数量受限于 server->max_coroutine 设置
返回值:创建失败返回 false,创建成功返回协程的 ID。
注意:由于底层会优先执行子协程的代码,因此只有子协程挂起时,Coroutine::create 才会返回,继续执行当前协程的代码。在一个协程中使用 go 嵌套创建新的协程。因为 Swoole 的协程是单进程单线程模型,因此,使用 go 创建的子协程会优先执行,子协程执行完毕或挂起时,将重新回到父协程向下执行代码;如果子协程挂起后,父协程退出,不影响子协程的执行。如下示例:
\Co\run(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]) 修改默认的栈内存尺寸
4) defer():defer 用于资源的释放,会在协程关闭之前 (即协程函数执行完毕时) 进行调用,就算抛出了异常,已注册的 defer 也会被执行。
Swoole\Coroutine::defer(callable $function); defer(callable $function); // 短名API
注意:需要注意的是,它的调用顺序是逆序的(先进后出), 也就是先注册 defer 的后执行,先进后出。逆序符合资源释放的正确逻辑,后申请的资源可能是基于先申请的资源的,如先释放先申请的资源,后申请的资源可能就难以释放。
示例:
go(function () {
defer(function () use ($db) {
$db->close();
});
});
5) exists():判断指定协程是否存在。
Swoole\Coroutine::exists(int $cid = 0): bool
示例:
\Co\run(function () {
go(function () {
go(function () {
Co::sleep(0.001);
var_dump(Co::exists(Co::getPcid())); // 1: true
});
go(function () {
Co::sleep(0.003);
var_dump(Co::exists

本文介绍了Swoole协程的核心API,包括设置、创建、资源管理、上下文、调度以及并发执行等。通过示例展示了如何使用如`create()`,`defer()`,`yield()`,`resume()`等方法,并提到了并发执行的`batch()`,`parallel()`,`map()`函数,以及协程的死锁检测功能。
最低0.47元/天 解锁文章
1652

被折叠的 条评论
为什么被折叠?



