python线程池的四种好处总结
作者:小妮浅浅 发布时间:2023-01-27 11:09:55
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 来代表。
来源:https://www.py.cn/jishu/jichu/30058.html
猜你喜欢
- 前言今天我的 PyCharm 突然间就死掉了,双击图标,等半天没有反应,也没有抛出什么错误。打开任务管理器,发现双击时启动了一个PyChar
- 从大的发展来看,网站就是一块试验田,一块在错误中成长、在错误中变强变大的试验田。这决定了互联网产品的成长路线,一定是一个反复修正和迭代的曲线
- 本文实例讲述了php设计模式之装饰模式。分享给大家供大家参考,具体如下:介绍装饰者模式(Decorator Pattern)允许你向一个现有
- Selenium Python 提供了一个简单的API 便于我们使用 Selenium WebDriver编写 功能/验收测试。 通过Sel
- 本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下# -*- coding:utf-8 -*-# @Time
- 一、动机最近打算折腾vn.py,但只有py27版本的,因为一向习惯使用最新稳定版的,所以不得不装py27的环境,不得不说 Python的全局
- 有时候在一个页面用到收放功能的时候时,总有一个虚线框在触发收放的功能按钮上,显得特别刺眼,那如何去除这个虚线框呢?在IE下,需要在标签 a
- 在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat 、 matrix 以
- 1.能调用方法的一定是对象,比如数值、字符串、列表、元组、字典,甚至文件也是对象,Python中一切皆为对象。 str1 = 'he
- 前言在我们实际开发中,经常需要将一组数据存储起来,以便使用。如果学习了其他的语言可能知道数组(Array)这个数据结构,它就可以将多个数据进
- 本文实例讲述了Python使用matplotlib实现在坐标系中画一个矩形的方法。分享给大家供大家参考。具体实现方法如下:import ma
- 本文主要介绍的是MySQL慢查询分析方法,前一段日子,我曾经设置了一次记录在MySQL数据库中对慢于1秒钟的SQL语句进行查询。想起来有几个
- 在python3中使用dict.keys()返回的不在是list类型了,也不支持索引,我们可以看一下下面这张图片那么我们应该怎么办呢,其实解
- 如下所示:# the basic ways = 0for x in range(10): s += x# the right ways =
- 问题描述:使用 SQL 2005 w/ SP2 的汇出汇入精灵将数据从 Access 汇入到 SQL2005 发生了错误,但使用在SQL 2
- 以用户为中心的设计、用户体验,这两个词现在在互联网上几乎随处可见,除了设计师外,很多的用户也都在说这两个词,于是我们经常会听到诸如“这里用户
- 1. 准备工作有朋友可能没用过folium,它其实就是python的一个专业绘制地图的第三方库,所以在使用之前需要先安装它。pip 
- 先来说一下我们学校的网站:http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html查询成绩需要登
- 本文实例讲述了Python类的用法。分享给大家供大家参考。具体如下:先看一段代码:#!/usr/bin/env pythonclass Te
- 在使用matplotlib模块时画坐标图时,往往需要对坐标轴设置很多参数,这些参数包括横纵坐标轴范围、坐标轴刻度大小、坐标轴名称等 在mat