Swoole从入门到入土(28)——协程[核心API]

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

本节专门介绍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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值