加入收藏 | 设为首页 | 会员中心 | 我要投稿 周口站长网 (https://www.0394zz.cn/)- 数据采集、智能营销、经验、云计算、专属主机!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

python线程池的好处有哪些,你知道几个?

发布时间:2022-03-15 14:06:06 所属栏目:语言 来源:互联网
导读:我们知道线程池在python爬虫应用中,能提高爬虫的效率,但是很多朋友不了解python线程池还有很多其他优点,下面我们一起来看看python线程池使用的好处,下文还介绍了python线程池实例,有需要的朋友可以了解一下。 1、使用好处 提高性能:由于减去了大量新建
        我们知道线程池在python爬虫应用中,能提高爬虫的效率,但是很多朋友不了解python线程池还有很多其他优点,下面我们一起来看看python线程池使用的好处,下文还介绍了python线程池实例,有需要的朋友可以了解一下。
 
    1、使用好处
        提高性能:由于减去了大量新建终止线程的费用,重用了线程资源;
 
        适用场景:适用于处理大量突发请求或需要大量线程完成任务,但实际任务处理时间短。
 
        防御功能:可以有效避免系统因线程过多而导致系统负载过大而相应变慢的问题。
 
        代码优势:使用线程池的语法比创建自己的线程更简单。
 
    2、实例
"""
@file   : 004-线程池的使用.py
@author : xiaolu
@email  : luxiaonlp@163.com
@time   : 2021-02-01
"""
import concurrent.futures
import requests
from bs4 import BeautifulSoup
 
 
def craw(url):
    # 爬取网页内容
    r = requests.get(url)
    return r.text
 
 
def parse(html):
    # 解析其中的内容
    soup = BeautifulSoup(html, "html.parser")
    links = soup.find_all("a", class_="post-item-title")
    return [(link["href"], link.get_text()) for link in links]   # 那链接和标题拿出来
 
 
if __name__ == '__main__':
    # 待爬取的网页链接
    urls = [
        "https://www.cnblogs.com/sitehome/p/{}".format(page) for page in range(1, 50 + 1)
    ]
        
    # craw
    with concurrent.futures.ThreadPoolExecutor() as pool:
        htmls = pool.map(craw, urls)
        htmls = list(zip(urls, htmls))
        for url, html in htmls:
            print(url, len(html))
    print("craw over")
    
    # parse
    with concurrent.futures.ThreadPoolExecutor() as pool:
        futures = {}
        for url, html in htmls:
            future = pool.submit(parse, html)
            futures[future] = url
    
        # for future, url in futures.items():
        #     print(url, future.result())
    
        for future in concurrent.futures.as_completed(futures):
            url = futures[future]
            print(url, future.result())
        知识点补充:
 
        线程池的使用
 
        线程池的基类是 concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即 ThreadPoolExecutor 和ProcessPoolExecutor,其中 ThreadPoolExecutor 用于创建线程池,而 ProcessPoolExecutor 用于创建进程池。
 
        如果使用线程池/进程池来管理并发编程,那么只要将相应的 task 函数提交给线程池/进程池,剩下的事情就由线程池/进程池来搞定。
 
        Exectuor 提供了如下常用方法:
 
        submit(fn, *args, **kwargs):将 fn 函数提交给线程池。*args 代表传给 fn 函数的参数,*kwargs 代表以关键字参数的形式为 fn 函数传入参数。
        map(func, *iterables, timeout=None, chunksize=1):该函数类似于全局函数 map(func, *iterables),只是该函数将会启动多个线程,以异步方式立即对 iterables 执行 map 处理。
        shutdown(wait=True):关闭线程池。
        程序将 task 函数提交(submit)给线程池后,submit 方法会返回一个 Future 对象,Future 类主要用于获取线程任务函数的返回值。由于线程任务会在新线程中以异步方式执行,因此,线程执行的函数相当于一个“将来完成”的任务,所以 Python 使用 Future 来代表。

(编辑:周口站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读