问题描述:
给公司写一个爬虫程序,因为速度很慢,因此考虑多线程解决。我采用的是生产消费模式。
首先生产者模块(Springboot)定时生产url到redis,(其实就是拼接的url字符串串),然后呢,开发了消费者模块(SpringBoot),这个模块开启10个线程去消费url,后面还会分不到多台机器上运行。现在就说单机吧。这个消费者会创建10个线程去redis中拿去url,因为用redis作为缓存队列,拿一个少一个,因此不存在线程安全问题,每个线程拿到了url就去访问,然后解析http返回,然后入库。
现在的问题是,这个消费者的10个线程在半个小时内运行都很快,但是到了半个小时候就越来越慢,日志打印信息看到的执行线程越来越少了。每个线程在处理ur的时候是死循环,即redis中只要有url就要获取并消费 没有就会阻塞,而生产者是定时的生产url到redis。现在的问题就是这写线程执行到后面就会越来越少,越来越少,最后程序就不跑了。线程的操作我做了中断异常捕获和其他异常捕获,如果是其他异常我就跳出本次循环继续下一次,如果是中断那就直接打印日志信息和break(好像也是多此一举),现在的问题是没有中断异常,可是线程不执行了。
非常的头痛,不怕报错 , 就怕错的找不到。各位师兄,指点迷津,谢谢
post请求超时,都是捕获的。然后数据库批量插入偶尔爆了一些非首检异常导致没被捕获我后面也手动抛出被捕获了。
最后程序不跑了,但是SpringBoot进程还在,最后能看到的信息就是下面这里
由于多线程操作我没有进行过这种几小时的运行,所以很多专业问题的理论知识不够充分,
线程会被cpu停止吗?
线程长时间在redis阻塞会自动停止吗?
既然被停止,那么中断异常为何不报呢?
还有我手动捕获非受检异常,那么就应该会被外部的Exception捕获,这有错吗?
这是最后程序不动了 只有这些信息 也不清楚和线程有没有关系
1、首先要说的是,你给的这个日志信息应该与上面你说的多线程问题没关系,这个是Spring boot程序在启动时打印出来的MySQL 连接池相关的信息。
2、具体问题没见到日志,不知道咋回答。但是根据经验,你说的这个应该是线程死锁了。建议通过ps、jstack等明令来确定你程序出现卡死的情况,找到比如线程死锁的原因,然后再参考修改。
要不你把进程dump下来分析看看