Python多线程爬虫编程中queue.Queue和queue.SimpleQueue的区别和应用

简介: 在Python中,queue模块提供了多种队列类,用于在多线程编程中安全地交换信息。其中,queue.Queue 和queue.SimpleQueue 是两个常用的先进先出(FIFO)的队列类,它们有以下区别和优缺点:queue.Queue 是一个更复杂的队列类实现涉及到多个锁和条件变量,因此可能会影响性能和内存效率。SimpleQueue 是一个更简单的队列类它只提供了put()和get()两个方法,并且不支持maxsize参数

247047476.jpg


在Python中,queue模块提供了多种队列类,用于在多线程编程中安全地交换信息。其中,queue.Queue 和queue.SimpleQueue 是两个常用的先进先出(FIFO)的队列类,它们有以下区别和优缺点:

  1. 1、queue.Queue 是一个更复杂的队列类,它提供了一些方法和功能,如限制队列大小、等待队列中的任务完成、检查队列是否为空或满等。这些功能可以方便地在多线程环境中同步生产者和消费者的行为,并且使得代码更易于设计、阅读和维护。
  • 2、queue.Queue 的缺点是它的实现涉及到多个锁和条件变量,因此可能会影响性能和内存效率。另外,它不能处理重入性的问题,即如果在同一线程中调用put()或get()方法时被打断,可能会导致死锁或数据丢失。
  • 3、queue.SimpleQueue 是一个更简单的队列类,它只提供了put()和get()两个方法,并且可以处理重入性的问题。因此,它有更好的性能和内存效率,并且可以在一些特殊情况下安全地调用put()或get()方法,如del方法、weakref回调或信号处理器。
  • 4、queue.SimpleQueue 的缺点是它只提供了put()和get()两个方法,并且不支持maxsize参数。因此,它不能限制队列大小,也不能等待队列中的任务完成。如果需要这些功能,可以使用queue.Queue 或者queue.JoinableQueue。

下面分别用Queue和queue.SimpleQueue,根据多线程网络请求的需求进行实现。

importqueueimportthreadingimportrequests# 定义一个队列对象,用于在多线程中传递数据q=queue.Queue()
# 定义一个函数,用于在子线程中发送请求,并使用代理IPdefsend_request():
# 从队列中获取数据,如果队列为空,则阻塞等待data=q.get()
# 获取代理IP地址、用户名和密码,以及目标URLproxy_ip=data["proxy_ip"]    
username=data["username"]
password=data["password"]
url=data["url"]
# 设置代理参数,包括代理IP、用户名和密码proxies= {
"http": f"http://{username}:{password}@{proxy_ip}",
"https": f"http://{username}:{password}@{proxy_ip}"    }
# 发送请求,并打印响应状态码和内容try:
response=requests.get(url, proxies=proxies)
print(f"Response status: {response.status_code}")
print(f"Response content: {response.text}")
exceptExceptionase:
print(f"Error: {e}")
# 通知队列任务已完成,并释放资源q.task_done()
# 在主线程中创建三个子线程对象,并传入send_request函数作为参数,并设置为守护线程(daemon)threads= []
foriinrange(3):
thread=threading.Thread(target=send_request, daemon=True)
threads.append(thread)
# 启动三个子线程,并将它们加入到主线程的等待列表中forthreadinthreads:
thread.start()
# 在主线程中向队列中放入数据,这里假设有三组代理IP和URL的组合data_list= [
    {"proxy_ip": "www.16yun.cn:3100", "username": "16YUN", "password": "16IP-ps1", "url": "http://example.com/1.html"},
    {"proxy_ip": "www.16yun.cn:3100", "username": "16YUN", "password": "16IP-ps2", "url": "http://example.com/2.html"},
    {"proxy_ip": "www.16yun.cn:3100", "username": "16YUN", "password": "16IP-ps3", "url": "http://example.com/3.html"}
]
fordataindata_list:
q.put(data)
# 等待队列中的所有任务完成,并阻塞主线程直到所有子线程结束q.join()

上面代码使用Queue实现了一个多线程的爬虫程序,通过3个线程采集不同的url,然后等待队列中的所有任务完成,并阻塞主线程直到所有子线程结束。

importqueueimportthreadingimportrequests# 定义一个SimpleQueue对象,用于在多线程中传递数据q=queue.SimpleQueue()
# 定义一个函数,用于在子线程中发送请求,并使用代理IPdefsend_request():
# 从队列中获取数据,如果队列为空,则阻塞等待data=q.get()
# 获取代理IP地址和目标URLproxy_ip=data["proxy_ip"]
url=data["url"]
# 获取用户名和密码username=data["username"]
password=data["password"]
# 设置代理参数,并添加认证信息proxies= {
"http": f"http://{proxy_ip}",
"https": f"http://{proxy_ip}"    }
auth=requests.auth.HTTPProxyAuth(username, password)
# 发送请求,并打印响应状态码和内容try:
response=requests.get(url, proxies=proxies, auth=auth)
print(f"Response status: {response.status_code}")
print(f"Response content: {response.text}")
exceptExceptionase:
print(f"Error: {e}")
# 在主线程中创建三个子线程对象,并传入send_request函数作为参数,并设置为守护线程(daemon)threads= []
foriinrange(3):
thread=threading.Thread(target=send_request, daemon=True)
threads.append(thread)
# 启动三个子线程,并将它们加入到主线程的等待列表中forthreadinthreads:
thread.start()
# 在主线程中向队列中放入数据,这里假设有三组代理IP和URL的组合,以及对应的用户名和密码data_list= [
    {"proxy_ip": "www.16yun.cn:3100", "url": "http://example.com/1.html", "username": "16YUN", "password": "16IP-ps1"},
    {"proxy_ip": "www.16yun.cn:3100", "url": "http://example.com/2.html", "username": "16YUN", "password": "16IP-ps2"},
    {"proxy_ip": "www.16yun.cn:3100", "url": "http://example.com/3.html", "username": "16YUN", "password": "16IP-ps3"}
]
fordataindata_list:
q.put(data)
# 等待所有子线程结束(由于是守护线程,所以当主线程结束时会自动结束)

上面代码使用SimpleQueue对象,实现了一个生产者-消费者模式的多线程爬虫程序程序。它的功能是在多个子线程中使用代理IP向目标URL发送HTTP请求,并打印响应状态码和内容,等待所有子线程结束。由于子线程设置为守护线程,所以当主线程结束时,子线程也会自动结束。

通过上述示例,可以分别根据目前的应用场景和需求选择适合的方式。

相关文章
|
5天前
|
机器学习/深度学习 数据可视化 算法
Python数值方法在工程和科学问题解决中的应用
本文探讨了Python数值方法在工程和科学领域的广泛应用。首先介绍了数值计算的基本概念及Python的优势,如易学易用、丰富的库支持和跨平台性。接着分析了Python在有限元分析、信号处理、优化问题求解和控制系统设计等工程问题中的应用,以及在数据分析、机器学习、模拟建模和深度学习等科学问题中的实践。通过具体案例,展示了Python解决实际问题的能力,最后总结展望了Python在未来工程和科学研究中的发展潜力。
|
12天前
|
Python
Python中Cp、Cpk、Pp、Ppk的计算与应用
总的来说,Cp、Cpk、Pp、Ppk是衡量过程能力的重要工具,它们可以帮助我们了解和改进生产过程,提高产品质量。
56 13
|
2月前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
334 9
|
2月前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
65 9
|
2月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
79 0
|
14天前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比
|
5月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
277 6
|
19天前
|
数据采集 存储 监控
Python 原生爬虫教程:网络爬虫的基本概念和认知
网络爬虫是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据采集、新闻聚合和价格监控等领域。其工作流程包括 URL 调度、HTTP 请求、页面下载、解析、数据存储及新 URL 发现。Python 因其丰富的库(如 requests、BeautifulSoup、Scrapy)和简洁语法成为爬虫开发的首选语言。然而,在使用爬虫时需注意法律与道德问题,例如遵守 robots.txt 规则、控制请求频率以及合法使用数据,以确保爬虫技术健康有序发展。
|
8月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
456 4
|
9月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
146 4
下一篇
oss创建bucket