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框架哦)



  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/lei0213/p/7979375.html
Copyright © 2011-2022 走看看