swoole| swoole 协程知识点小结

2019-05-02  本文已影响0人  daydaygo

date: 2019-04-30 23:11:23
title: swoole| swoole 协程知识点小结

swoole| swoole 协程知识点小结

本文要点:

swoole 协程现状一览

swoole 一直保持着 颇为快速 的迭代速度, 快到什么程度呢 -- 「快别更新了, 学不动了」

来一句灵魂叩问: 改动这么大, 那是不是真的 「学不动了」?

并不是! swoole 是一直在为 世界上最好的语言 添砖加瓦:

使用 swole 协程

如何使用协程:

use Swoole\Coroutine as Co; // 常用的缩写方式

go(function () { // 创建协程, 回调函数中写需要在协程中执行的代码
    echo "daydaygo";
    Co::sleep(1); // 不能是阻塞代码
});

swoole 中协程就是这么简单: 开个协程, 协程里写非阻塞代码. 官方协程部分文档看起来很多, 牢记这两点, 其实很简单!

开协程

// tcp/udp server, 可以在此基础可封装 rpc
$s = new \Swoole\Server();

// http server, 替代传统的 fpm
$s = new \Swoole\Http\Server();

// 开启 http2 支持: https://wiki.swoole.com/wiki/page/326.html
$s = new \Swoole\Http\Server();
$s->set([
    'open_http2_protocol' => true,
]);
// 进而可以实现基于 http2 的服务, 比如 grpc

// websocket server
$s = new \Swoole\WebSocket\Server();

非阻塞代码

协程中必须编写 非阻塞代码, 看到上面 Co::sleep(1) 的小伙伴会有疑问了:

连个 sleep 都要 swoole 提供一个协程版, 我得掌握多少 swoole 协程版 API 才够呀?

所以问题的关键点来了:

swoole 更新后, 添加了开启协程 runtime 功能:

// 没有开启协程 runtime, 需要协程版 API
use Swoole\Coroutine as Co;

go(function () {
    echo "daydaygo";
    Co::sleep(1); // 需要使用 swoole 提供的协程版 API
});

// 开启协程 runtime
\Swoole\Runtime::enableCoroutine();
go(function () {
    echo "daydaygo";
    sleep(1); // 和原来编程一样了
});

协程 runtime 开启后, 支持的列表:

不支持的列表:

协程 runtime 还不支持怎么办

需要的功能协程 runtime 下还没支持怎么办? 你有三种方法:

public function connect()
{
    // 使用 Swoole\Coroutine\Client 
    $sock = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
    if (!$sock->connect($this->host, $this->port, $this->connection_timeout))
    {
        throw new AMQPRuntimeException(
            sprintf(
                'Error Connecting to server(%s): %s ',
                $sock->errCode,
                swoole_strerror($sock->errCode)
            ),
            $sock->errCode
        );
    }
    $this->sock = $sock;
}

PS: 这里只是抛砖引玉, 原库中使用 stream_socket_client(), 现在 swoole 协程 runtime 已经支持了

展望 swoole 协程的未来

到目前为止, 希望小伙伴们已经 get 到了 swoole 中协程编程的要点(我喜欢用 姿势, 人最紧要的是姿势好看~), 让我们展望一下未来:

写在最后

官方协程部分的文档看起来多, 其实多是对协程 API 的介绍, 并没有在知识结构理解的复杂度上有所增加. swoole 中协程的编程语法, 都在 \Swoole\Coroutine 命名空间下可以找到.

最后回到一个经典问题, 学习 swoole 的协程好, 还是学习 go 的协程好? 我谈谈我个人的观点:

上一篇 下一篇

猜你喜欢

热点阅读