情况是这样,用workerman弄了个【任务处理器】,300子线程,text协议,不对外,只用于本机环回地址(127.0.0.1)的使用。
然后每个用户能开启或关闭自己的任务,每一个任务都是一个workerman★任务监控器★,php start的workerman实例,主线程,1子线程。一旦用户开启自己的任务,就会在一定条件下触发任务的执行处理,触发任务需要处理时,★任务监控器★是不执行任务处理的,它会把数据发送给【任务处理器】去处理。
大概是这样:
用户1★任务监控器★----->通知【任务处理器】处理任务
用户2★任务监控器★----->通知【任务处理器】处理任务
用户3★任务监控器★----->通知【任务处理器】处理任务
……
整体结构大概是:
★任务监控器★ 里,$worker = new Worker()
$worker触发任务时,$at = new AsyncTcpConnection(),$at->send()数据给【任务处理器】,redis统计线程使用+1
【任务处理器】处理完,send()任务完成字符通知$at,$at->onMessage里 redis统计线程使用-1
正常跑,没问题。但发现【任务处理器】发生错误(原因未知,找不出来,workerman的日志里没有报错,我自己的日志里也没有报错),这个先不管,就是【任务处理器】发生错误后(跑了十几个小时后出现),redis统计线程使用 不会-1,在高并发的时候,redis统计线程使用 数量马上就上去了。
【任务处理器】结构大概是:
$worker = new Worker(...);
$worker->onMessage = function($connection, $data){
$xxx = new xxx();
xxx->yyy();
$connection->send(json_encode([
'event'=>'success',
'msg'=>'处理完毕',
]));
}
没有return跳过$connection->send(),只可能是xxx->yyy()出了问题(这个我会继续排查)。但现在的这种情况,是不是意味着:一旦【任务处理器】的300个子线程里只要有一个子线程发生崩溃,就会导致300个子线程全部崩溃或者处理不了任务?然后守护进程是会自动把【任务处理器】重启继续跑?这样一个用户出问题,就影响了所有用户……
这样的话,是不是我应当为每个用户分配一个独立自用的【任务处理器】?这样一个用户一旦出问题,不会影响其他用户?
workerman是多进程,不是多线程。一个进程报错,不影响其它进程。
我再核查看看