Event::onWorkerStart执行耗时操作

osacar

当前的设计是这样的:在workerman-chat的Event::onWorkerStart中设置一个定时器,定时去获取各个订单的运单状态(根据快递公司的API来获取)。如果运单状态有更新则直接当作聊天记录发送给用户和商家(项目与gateway通信这个已经修好,再次感谢walkor)。

gateway手册上说“不要在onWorkerStart内执行长时间阻塞或者耗时的操作”。
示例代码如下:

public static function onWorkerStart(){
        // 每1小时执行一次
        $time_interval = 3600;
        Timer::add($time_interval, 'check_express', array(), false);
    }

请问,check_express()是一比较耗时的操作,像上面的设计会有阻塞影响么?

3035 4 0
4个回答

walkor

定时器影响不大,GatewayWorker中onWorkerStart不允许有长时间阻塞操作是为了让businessWorker与Gateway之间能快速链接,只有businessWorker与Gateway之间建立起通讯链接,整个系统才能使用。否则会有SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready错误

  • 暂无评论
walkor

不过即使定时器不影响businessWorker与Gateway之间建立起通讯链接,由于定时器的任务正在执行时当前进程无法处理其它业务请求,如果任务执行时间很长,会导致这个进程的请求排队等待。

  • 暂无评论
osacar

我可不可以这样理解,因为onWorkerStart只在启动时执行一次。在onWorkerStart里设置定时器只是为了触发定时启动而已,并且系统启动时还没有达到执行业务时间。那么只要在定时间隔内(这里是一个小时,我觉得这个任务应该是几秒内就能完成)完成了check_express()里的业务就不会对整个聊天系统有影响?

  • 暂无评论
walkor

可以这么理解

  • 暂无评论
年代过于久远,无法发表回答
🔝