V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wjx1993
V2EX  ›  Python

socket 多线程运行报错,大佬们帮帮看下

  •  
  •   wjx1993 · 2018-04-24 10:52:12 +08:00 · 4286 次点击
    这是一个创建于 2437 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:同时开了几千个线程,运行到 300 多个线程的时间报错了, socket.setdefaulttimeout(45) sleep_download_time = 1 time.sleep(sleep_download_time) 超时和延时都有加上

    1、ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 这个我认为是被服务器拒绝了,被发是爬虫了?

    2、socket.timeout: timed out 这个我已经设置了超时的时间,还是报错了

    32 条回复    2018-04-25 17:14:58 +08:00
    wjx1993
        1
    wjx1993  
    OP
       2018-04-24 11:13:02 +08:00 via Android
    求大佬们帮忙看看,跪求😂
    ai277014717
        2
    ai277014717  
       2018-04-24 11:20:29 +08:00
    为什么要开着么多线程?是没试过最多可以开多少个线程?
    HypoChen
        3
    HypoChen  
       2018-04-24 11:26:03 +08:00
    几千个线程去爬,可能不是发现是爬虫了,是发现被 D 了。。。。
    wjx1993
        4
    wjx1993  
    OP
       2018-04-24 11:27:51 +08:00 via Android
    @HypoChen 怎么解决这个问题
    wjx1993
        5
    wjx1993  
    OP
       2018-04-24 11:28:44 +08:00 via Android
    @ai277014717 多线程效率高啊!怎么解决这个问题・_・?一个线程跑正常
    goofool
        6
    goofool  
       2018-04-24 11:30:00 +08:00
    每个线程一个代理吗?
    wjx1993
        7
    wjx1993  
    OP
       2018-04-24 11:32:04 +08:00 via Android
    @goofool 没有用代理,这个还要代理?
    A555
        8
    A555  
       2018-04-24 11:33:46 +08:00
    @wjx1993 你这样去请求别人 把你 ip 封了
    wjx1993
        9
    wjx1993  
    OP
       2018-04-24 11:36:18 +08:00 via Android
    @A555 应该不是封 ip,我重新运行后还是可以跑的,每次重新跑都是大概跑到 300 多线程就保存了
    onepunch
        10
    onepunch  
       2018-04-24 11:40:46 +08:00
    你把 sleep 设置的时间长一点
    wjx1993
        11
    wjx1993  
    OP
       2018-04-24 11:45:57 +08:00 via Android
    @onepunch 时间设置太久就没意义了,要跑的内容太多了,好几千个线程要等到什么时候?
    susecjh
        12
    susecjh  
       2018-04-24 11:48:24 +08:00
    线程多就一定快?想多了
    ai277014717
        13
    ai277014717  
       2018-04-24 11:50:49 +08:00
    @wjx1993 多线程效率不一定高。nodejs 还是单线程呢。看看磁盘内存 CPU 有没有瓶颈吧。还要考虑到网站服务器的承受能力,有的服务器可能还没个人 pc 的配置高呢。
    ericls
        14
    ericls  
       2018-04-24 11:55:06 +08:00 via iPhone
    爬虫的精髓在于怎么慢 而不是怎么快
    changnet
        15
    changnet  
       2018-04-24 12:04:44 +08:00 via Android
    我一直不理解开很多线程的代码逻辑,尤其有些库在测试性能时还开了几百个,难不成大家的 cpu 都是几百上千核的,或者是逻辑都是阻塞写法。开了那么多线程,我的其他逻辑还要不要跑了,三五个线程差不多了。
    wjx1993
        16
    wjx1993  
    OP
       2018-04-24 12:20:31 +08:00 via Android
    @changnet 一般上限是 3 万多,但是这个是可以设置的,这个要看你怎么写了
    linyinma
        17
    linyinma  
       2018-04-24 12:20:37 +08:00
    @wjx1993
    从你的描述很显然啊,远程服务器设置了瞬时并发数啊(如 nginx 添加 nginx_http_limit_conn_module )来限制同一个 ip 来源的连接数,防止恶意攻击访问)
    wjx1993
        18
    wjx1993  
    OP
       2018-04-24 12:22:10 +08:00 via Android
    @susecjh 不是说一定快,我是说要爬的内容必须要同时运行,所以才用了多线程
    wjx1993
        19
    wjx1993  
    OP
       2018-04-24 12:22:56 +08:00 via Android
    @ericls 太慢的话,还没爬完,数据就没了😂
    wjx1993
        20
    wjx1993  
    OP
       2018-04-24 12:24:43 +08:00 via Android
    @linyinma 是不是只有用 ip 代理才可以解决? 那我要怎么设置切换 ip ?
    WordTian
        21
    WordTian  
       2018-04-24 12:36:48 +08:00 via Android
    你一个 ip 整上千个并发连接,你不被拦谁被拦
    wjx1993
        22
    wjx1993  
    OP
       2018-04-24 12:45:58 +08:00 via Android
    @WordTian socket 应该怎么切换代理
    WordTian
        23
    WordTian  
       2018-04-24 16:20:25 +08:00 via Android
    用 squid 吧
    WordTian
        24
    WordTian  
       2018-04-24 16:22:31 +08:00 via Android
    @WordTian 噢,刚发现 squid 主要是 HTTP 代理,socket 的我还真不知道
    defphilip
        25
    defphilip  
       2018-04-24 19:46:51 +08:00
    开几千个线程的爬虫。。。。系统吃的消吗
    真的想用多线程,开个线程池几个线程并发跑就好了
    wjx1993
        26
    wjx1993  
    OP
       2018-04-24 21:37:39 +08:00 via Android
    @defphilip 还好吧,只是跑到 300 多就被服务器拒绝了,线程池总是有点问题,调了好长时间,话说线程池就不会报错被服务器拒绝了吗?
    wjx1993
        27
    wjx1993  
    OP
       2018-04-25 14:36:40 +08:00 via Android
    @defphilip 线程池要怎么写?大佬有例子介绍一下吗?😂
    wjx1993
        28
    wjx1993  
    OP
       2018-04-25 15:13:42 +08:00 via Android
    沉了吗
    ai277014717
        29
    ai277014717  
       2018-04-25 15:38:27 +08:00
    @wjx1993 参考前面说的你想办法爬慢点就能解决了。并发控制到 300 以下试试。
    线程池我觉的可有可无,主要是写了可以减少开销。
    wjx1993
        30
    wjx1993  
    OP
       2018-04-25 15:44:56 +08:00 via Android
    @ai277014717 不能爬太慢,需求就是要同时并发好几千,所以暂时只想到用线程池,但是自己写的线程池总是有问题,跑不起来所以请教一下线程池的写法,最好有个例子最好了,多谢啦!
    hcnhcn012
        31
    hcnhcn012  
       2018-04-25 15:58:05 +08:00 via iPhone
    concurrent.futures.ThreadPoolExecutor 了解一下
    wjx1993
        32
    wjx1993  
    OP
       2018-04-25 17:14:58 +08:00 via Android
    @hcnhcn012 好的,多谢!不过我又分析了一下自己的需求,发现目前用不了多进程,只能多线程了,不过会被服务器拒绝,请问有比较好的 socket 代理吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4025 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:00 · PVG 09:00 · LAX 17:00 · JFK 20:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.