背景:同时开了几千个线程,运行到 300 多个线程的时间报错了, socket.setdefaulttimeout(45) sleep_download_time = 1 time.sleep(sleep_download_time) 超时和延时都有加上
1、ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 这个我认为是被服务器拒绝了,被发是爬虫了?
2、socket.timeout: timed out 这个我已经设置了超时的时间,还是报错了
1
wjx1993 OP 求大佬们帮忙看看,跪求😂
|
2
ai277014717 2018-04-24 11:20:29 +08:00
为什么要开着么多线程?是没试过最多可以开多少个线程?
|
3
HypoChen 2018-04-24 11:26:03 +08:00
几千个线程去爬,可能不是发现是爬虫了,是发现被 D 了。。。。
|
5
wjx1993 OP @ai277014717 多线程效率高啊!怎么解决这个问题・_・?一个线程跑正常
|
6
goofool 2018-04-24 11:30:00 +08:00
每个线程一个代理吗?
|
9
wjx1993 OP @A555 应该不是封 ip,我重新运行后还是可以跑的,每次重新跑都是大概跑到 300 多线程就保存了
|
10
onepunch 2018-04-24 11:40:46 +08:00
你把 sleep 设置的时间长一点
|
12
susecjh 2018-04-24 11:48:24 +08:00
线程多就一定快?想多了
|
13
ai277014717 2018-04-24 11:50:49 +08:00
@wjx1993 多线程效率不一定高。nodejs 还是单线程呢。看看磁盘内存 CPU 有没有瓶颈吧。还要考虑到网站服务器的承受能力,有的服务器可能还没个人 pc 的配置高呢。
|
14
ericls 2018-04-24 11:55:06 +08:00 via iPhone
爬虫的精髓在于怎么慢 而不是怎么快
|
15
changnet 2018-04-24 12:04:44 +08:00 via Android
我一直不理解开很多线程的代码逻辑,尤其有些库在测试性能时还开了几百个,难不成大家的 cpu 都是几百上千核的,或者是逻辑都是阻塞写法。开了那么多线程,我的其他逻辑还要不要跑了,三五个线程差不多了。
|
17
linyinma 2018-04-24 12:20:37 +08:00
@wjx1993
从你的描述很显然啊,远程服务器设置了瞬时并发数啊(如 nginx 添加 nginx_http_limit_conn_module )来限制同一个 ip 来源的连接数,防止恶意攻击访问) |
21
WordTian 2018-04-24 12:36:48 +08:00 via Android
你一个 ip 整上千个并发连接,你不被拦谁被拦
|
23
WordTian 2018-04-24 16:20:25 +08:00 via Android
用 squid 吧
|
25
defphilip 2018-04-24 19:46:51 +08:00
开几千个线程的爬虫。。。。系统吃的消吗
真的想用多线程,开个线程池几个线程并发跑就好了 |
26
wjx1993 OP @defphilip 还好吧,只是跑到 300 多就被服务器拒绝了,线程池总是有点问题,调了好长时间,话说线程池就不会报错被服务器拒绝了吗?
|
28
wjx1993 OP 沉了吗
|
29
ai277014717 2018-04-25 15:38:27 +08:00
@wjx1993 参考前面说的你想办法爬慢点就能解决了。并发控制到 300 以下试试。
线程池我觉的可有可无,主要是写了可以减少开销。 |
30
wjx1993 OP @ai277014717 不能爬太慢,需求就是要同时并发好几千,所以暂时只想到用线程池,但是自己写的线程池总是有问题,跑不起来所以请教一下线程池的写法,最好有个例子最好了,多谢啦!
|
31
hcnhcn012 2018-04-25 15:58:05 +08:00 via iPhone
concurrent.futures.ThreadPoolExecutor 了解一下
|