swoole_server->finish [编辑本页]

此函数用于在task进程中通知worker进程,投递的任务已完成。此函数可以传递结果数据给worker进程。

$serv->finish("response");

使用swoole_server::finish函数必须为Server设置onFinish回调函数。此函数只可用于task进程的onTask回调中

  • finish方法可以连续多次调用,Worker进程会多次触发onFinish事件
  • onTask回调函数中调用过finish方法后,return数据依然会触发onFinish事件

swoole_server::finish是可选的。如果worker进程不关心任务执行的结果,不需要调用此函数
在onTask回调函数中return字符串,等同于调用finish


  • tencent_star

    用1.7.18-stable版本,调用$serv->finish()后并没有出发onFinish事件是怎么回事?用的是github上task.php示例代码

  • 呼吸二氧化碳

    这个里面有个坑(v1.7.21) 如果在task里调用 $serv->finish("response"); 后接着还要运行一些代码,实际上会受 worker 里使用 $serv->taskwait() 和 $serv->task() 表现不一致 如果在worker 里调用的是 $serv->taskwait() ,则会立即收到 $serv->finish("response"); 的反馈 而如果在 worker 里调用的是 $serv->task(),则会等到整个 onTask 全部执行完毕,onFinish 才会收到 $serv->finish("response"); 的反馈,而不是在代码位置的时候收到,此时和代码结束出 return 'response' 一样。

    另外一个差异就是,如果在 onTask 里先调了 finish('ok1') 再 return 'ok2' 的话, 如果在worker里调的是 $serv->task() 则在onFinish 里会分别收到2次回调 而如果在worker里调的是 $serv->taskwait() 则只会立即返回 ok1 ,ok2 则会被丢弃了

  • SamuelYu

    这个坑我琢磨了好久,多谢二氧化碳给出解决方案

  • 许培

    多谢 学习了