使用协程的注意事项

多个 Swoole 协程的执行顺序时是无序的,这通常取决于每个 Swoole 协程任务的时间复杂度,因此,对于处理 Web 请求的 HTTP 服务器来说,每个请求的数据都要与特定的协程 ID 关联起来,才能让业务逻辑正确执行。

协程下代码执行顺序是乱序的,请求级的数据应该以协程ID隔离,但Laravel/Lumen中存在很多单例、静态属性,不同请求间的数据会相互影响,这是不安全的。比如数据库连接就是单例,同一个数据库连接共享同一个PDO资源,这在同步阻塞模式下是没问题的,但在异步协程下是不行的,每次查询需要创建不同的连接,维护不同的IO状态,这就需要用到连接池。所以不要打开协程,仅自定义进程中可使用协程。

在LaravelS中的使用

LaravelS 配置文件 config/laravels.php 中有两个与协程相关的配置:

创建一个用户自定义的进程 TestProcess 并在其中使用协程,自定义进程需要实现 CustomProcessInterface 接口

在配置文件 config/laravels.php 中注册自定义进程:

用户自定义进程生命周期和 Master 和 Manager 进程一样,在服务器启动时创建,因此可用于监控、上报或完成其它特殊的全局任务,这里我们使用 TestProcess 来调度 TestTask 任务的执行

在项目根目录下启动基于 Swoole 的 laravels 服务器:

然后我们就可以在 storage/logs 目录下最新的日志文件中看到 TestProcess 回调函数的触发和 TestTask 任务的执行

由于使用协程的缘故,这些任务都是每隔 1 秒执行一次,而且是异步非阻塞的。


REFERENCE


发表评论

电子邮件地址不会被公开。 必填项已用*标注