zoukankan      html  css  js  c++  java
  • python爬虫之爬虫性能篇

    一、首先想到的是for循环,单线程爬取每个url,但是如果有url出现了问题,后面的url就得等,性能低。

    二、我们考虑线程池的问题,下面我们定义了线程池里面最多10个任务,也就是说最多同一时间只能有10个爬行任务,这样的话就是自己干自己的互相不影响,加上主线程的话是n+1个线程,缺点也很明显,耗时最长时间取决于最长的那个任务使用的时间。pool.shutdown(True)主线程等待子线程执行完城后,再退出。

    import requests
    from concurrent.futures import ThreadPoolExecutor
    
    def fetch_request(url):
        requests.get(url)
    
    pool = ThreadPoolExecutor(10)
    url_list = [
        'https://www.baidu.com',
        'https//:www.douban.com'
    ]
    
    for url in url_list:
        pool.submit(fetch_request,url)
    
    
    pool.shutdown(True)
    简单线程池

     三、多进程,进程池的基本写法。

    import requests
    from concurrent.futures import ProcessPoolExecutor
    
    def fetch_request(url):
        requests.get(url)
    
    pool = ProcessPoolExecutor(10)
    url_list = [
        'https://www.baidu.com',
        'https//:www.douban.com'
    ]
    
    for url in url_list:
        pool.submit(fetch_request,url)
    
    
    pool.shutdown(True)
    简单多进程
    总结:
      1、首先利用for循环肯定是最次的串行写法,其次我们讨论多进程和多线程的效率。
      2、多进程首先要开通很多的内存空间,耗空间。IO方面的话两者基本一样,我们知道线程是存在于进程里面的,所以得出多线程是效率最高的。


    那么问题来了,例如我开了线程池,里面同时可执行10个线程,那么这10个线程同时执行的话,得等待返回response,那就在那傻傻的等,我们还想让他干点别的事怎么办?这里我们就要涉及到了异步io,其实我个人理解就是比线程更加小的线程(微线程),主要特点是非租塞,回调(成没成都会告诉你),主流的技术asyncio、gevent、Twisted、
    Tornado(Tornado不只是web框架哦)



  • 相关阅读:
    jaxb 专题一(JAXB 实现java对象与xml之间互相转换)
    spring @Transactional注解参数详解
    Spring声明式事务管理与配置详解
    spring源码解析--事务篇(前篇)
    Java的三种代理模式
    Spring AOP面向切面编程详解
    Spring AOP基于注解的“零配置”方式实现
    Spring AOP 中pointcut expression表达式解析及配置
    Spring AOP详解
    一种解决maven单继承的办法
  • 原文地址:https://www.cnblogs.com/lei0213/p/7979375.html
Copyright © 2011-2022 走看看