swoole_server->task
投递一个异步任务到 task_worker 池中。此函数是非阻塞的,执行完毕会立即返回。Worker 进程可以继续处理新的请求。使用Task功能,必须先设置 task_worker_num,并且必须设置 Server 的 onTask 和 onFinish 事件回调函数。
注意事项:
- 使用 task 必须为 Server 设置 onTask 和 onFinish 回调,否则
swoole_server->start
会失败 - task 操作的次数必须小于 onTask 处理速度,如果投递容量超过处理能力,task 会塞满缓存区,导致 worker 进程发生阻塞。worker 进程将无法接收新的请求
- 使用 addProcess 添加的用户进程中无法使用 task 投递任务,请使用 sendMessage 接口与 Task 工作进程通信
Task 实例
创建 Server
|
|
设置task_worker_num
设置task_worker_num是我们使用 task 中不可缺少的一点哦
客户端链接回调
|
|
接受客户端数据,使用 task
|
|
设置 Server 的 onTask 和 onFinish 事件回调函数
|
|
关闭
|
|
执行程序
|
|
客户端还是用我们上一篇简单的Server Client中的client.php。
执行查看 client 结果:
执行查看 server 结果:
从上边 server 执行的结果可以看出,task执行已经在 close 之后了,这样就知道什么是异步任务了吧。
总结一下应用场景:
- 没有耗时任务的情况下,worker直接运行,无需开启task
- 对于耗时的任务,可以在worker内调用task函数,把异步任务投递给task进程进行处理,task进程的数量取决于task_worker_num的配置
- task进程内可以选择调用finish方法或者return,来通知worker进程此任务已完成,worker进程会在onFinish回调中对task的执行结果进一步处理。如果worker进程不关心任务的结果,finish就不需要做处理了。