进程池,线程池与跨进程数据共享爬取某岸网图片

看教程的时候看到一个,生产者跟消费者的概念比较有意思,但是给的代码有问题无法正常运行,于是我就捣鼓了一下。
基本概念就是:
                        生产者:     一个进程获取网页没页的图片连接(主进程)
                        消费者:        一个进程下载图片,不同的是每个页面有20张图片,所以在进程中又开了二十线程(子进程)
嗯,概念就是这样接下来看代码

# -*- coding: utf-8 -*-
# @Time :2023/9/30 22:46
# [url=home.php?mod=space&uid=686208]@AuThor[/url]  : 
# @FileName :进程池.线程池配合使用与进程共用变量的使用.py
# [url=home.php?mod=space&uid=2097534]@IED[/url] :PyCharm""""""
import multiprocessing
import requests
import os
from concurrent.futures import ThreadPoolExecutor
from lxml import etreepath = r'D:\img'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/117.0.0.0 Safari/537.36'
}# 获取图片地址
def get_url(url, que):resp = requests.get(url, headers=headers)resp.encoding = resp.apparent_encodingdate = resp.texttree = etree.HTML(date)list_url = tree.xpath('//ul[@class="clearfix"]/li/a')for i in list_url:url_img = i.xpath('./img/@src')que.put('https://pic.netbian.com' + str(*url_img))  # put写入进程变量队列中resp.close()#  下载并保存图片
def download_ove(url, name):try:resp = requests.get(url, headers=headers)path_img = os.path.join(path, f'{name.value}.jpg')with open(path_img, 'wb') as f:f.write(resp.content)print(f'保存成功{name.value}.jpg')name.value += 1  # 数值型进程变量自增except Exception as ex:print('下载出错', ex)#  获取进程队列中的url并启用线程池下载保存图片
def download_img(que, name):# 创建线程池,指定20个线程处理数据with ThreadPoolExecutor(20) as t:while True:try:s = que.get(timeout=3)  # 获取进程队列中的数据,等待3秒若是还没获取到数据抛出异常t.submit(download_ove, s, name)  # 添加进线程池# t.submit(download_ove, s).add_done_callback(err_call_back)  #  获取线程池异常except Exception as ec:print(ec)break#  接收进程池与线程池异常的回调函数
def err_call_back(err):print(f'出错啦~ error:{str(err)}')if __name__ == '__main__':if not os.path.exists(path):os.mkdir(path)que = multiprocessing.Manager().Queue()  # 创建一个进程之间共享的队列变量name = multiprocessing.Manager().Value('i', 0)  # 创建一个进程之间共享的数值型变量,'i'表示整型数字,0表示从0开始for i in range(1, 4):if i != 1:url = f'https://pic.netbian.com/4kdongman/index_{i}.html'else:url = 'https://pic.netbian.com/4kdongman/'get_url(url, que)#  创建进程池,并将函数添加到进程池内,指定最多开辟1个进程处理数据(开多了怕把网址玩崩)with multiprocessing.Pool(1) as pool:pool.apply(download_img, args=(que, name))  # 将函数以同步的方式添加进进程池# apply_async异步方式无法使用不知道为啥,不报异常也不运行download_img函数# pool.apply_async(download_img, args=(que, name), error_callback=err_call_back)pool.close()  # 结束进程池,不在往内添加数据pool.join()  # 等待进程池运行结束print('结束')

本代码仅作为练习所用,大家别把人家网站搞崩了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django框架之中间件

目录 一、引入 二、Django中间件介绍 【1】什么是Django中间件 【2】Django中间件的作用 【3】示例 三、Django请求生命周期流程图 四、Django中间件是Django的门户 五、Django中间件详解 六、中间件必须要掌握的两个方法 (1) process_request (2) process_respon…

Redis集群环境各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的解决方式

原创/朱季谦 在搭建Redis5.x版本的集群环境曾出现各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的情况,故而把解决方式记录下来。 在以下三台虚拟机机器搭建Redis集群—— 192.168.200.160192.168.200.161192.168.200.162启动三台Redis集…

芯知识 | MP3语音芯片IC的优势特征及其在现代科技应用中的价值

随着科技的飞速发展,MP3语音芯片作为一种高度集成的音频处理解决方案,在现代电子产品中发挥着越来越重要的作用。本文将分析MP3语音芯片的优势特征,并探讨其在各个领域的应用价值。 一、MP3语音芯片的优势特征 MP3语音芯片具有多种显著的优…

CC++输入输出流介绍

介绍 C中的输入输出流主要包括标准输入输出流、文件输入输出流和内存数据流。 标准输入输出流可以通过使用cin和cout进行数据的读取和输出文件输入输出流可以通过使用ifstream和ofstream对文件进行读写操作内存数据流可以通过使用stringstream对字符串进行读写操作 应用举例…

服务器租用收费标准是什么?

服务器在企业转型中或者是互联网企业中起着举足轻重的作用,服务器有强大的存储能力和计算能力,能够帮助企业存储大量信息,完成日常工作,服务器租用就是通过正规的IDC服务器商家那里获取服务器资源,根据企业自身需求选择…

Python爬虫-获取汽车之家新车优惠价

前言 本文是该专栏的第10篇,后面会持续分享python爬虫案例干货,记得关注。 本文以汽车之家新车优惠价为例,获取各车型的优惠价,示例图如下: 地址:aHR0cHM6Ly9idXkuYXV0b2hvbWUuY29tLmNuLzAvMC8wLzQyMDAwMC80MjAxMDAvMC0wLTAtMS5odG1sI3B2YXJlYWlkPTIxMTMxOTU= 需求:获…

OpenStack云计算平台

目录 一、OpenStack 1、简介 2、硬件需求 3、网络 二、环境搭建 1、安全 2、主机网络 3、网络时间协议(NTP) 4、OpenStack包 5、SQL数据库 6、消息队列 7、Memcached 一、OpenStack 1、简介 官网:https://docs.openstack.org/2023.2/ OpenStack系统由…

Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案自己写的HLS图像缩放方案 3、设计思路详解Video Processing Subsystem 介绍 4、工程代码详解PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项…

给sprite上增加刷光动效

游戏引擎 —— cocos creator 3.52 此动效给动态修改尺寸的图片增加一层刷光的效果,直接贴代码 CCEffect %{techniques:- passes:- vert: sprite-vs:vertfrag: sprite-fs:fragdepthStencilState:depthTest: falsedepthWrite: falseblendState:targets:- blend: tr…

Charles 网络抓包工具详解与实战指南

文章目录 导读软件版本Charles基本原理核心功能下载及安装界面介绍网络包展示 常用场景介绍PC 端网络抓包移动端网络抓包PC 端配置手机端配置 开启 SSL 代理PC 端和移动端 CA 证书安装Charles 直接安装Charles 下载 CA 文件手动安装 常用操作请求重发请求改写、动态改写断点&am…

Qt+SQLITE数据库设计的会员卡管理系统

一、前言 本项目演示在QT中使用SQLITE数据库存储数据管理的过程。当前以会员卡管理系统为例,写了一个界面,完成会员卡的注册,添加,充值,查询,注销,导出顾客信息EXECL表格 等功能的实现。 演示 SQLITE数据库的建表、增、删、改、查等语句功能实现。 SQLite是一款轻型的…

计算机网络——物理层相关习题(计算机专业考研全国统考历年真题)

目录 2012-34 原题 答案 解析 2018-34 原题 答案 解析 2009/2011-34 原题 答案 解析 2016-34 原题 答案 解析 2014-35/2017-34 原题 答案 解析 2013-34 原题 答案 解析 2015-34 原题 答案 解析 物理层的协议众多,这是因为物理层…

为啥 有了锤子,看啥都是钉子?

坏处:有了锤子,看啥都是钉子,有何坏处? 事倍功半,甚至适得其反。比如具有高并发设计经验的人,在初创系统初期,就设计高并发架构,其复杂度大概率无法支持试点业务快速落地&#xff0…

【DevOps】Git 图文详解(九):工作中的 Git 实践

本系列包含: Git 图文详解(一):简介及基础概念Git 图文详解(二):Git 安装及配置Git 图文详解(三):常用的 Git GUIGit 图文详解(四)&a…

【SpringMVC】 三层架构

一.lombok工具包 中央仓库查找这个工具包:https://mvnrepository.com/ 给类添加Data注解就可以获取gettter和setter方法 , 这样我们就不必写getter 和 setter 方法. 也可以给成员属性添加单独的getter 和 setter , 针对某个成员属性单独添加setter或setter方法. 二.如果使用spr…

ORACLE手动建库

1.确定oracle的实例名,以及数据库名 实例名称: ORACLE_SIDtest 数据库名称: test 2.手工创建如下目录: /oracle/admin/test/adump --对应的是spfile里参数audit_file_dest …

一起学docker系列之七docker容器卷技术

目录 1 为什么使用容器数据卷?2 数据卷的特点和优势3 使用数据卷的方法3.1 创建容器并挂载数据卷3.2 容器间数据卷的共享与继承 4 数据卷的权限设置5 注意事项5.1 解决权限问题5.2 路径自动创建 结语 对于容器化应用程序的数据管理和持久化,Docker 数据卷…

链表的回文结构

题目描述 题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们的思路是: 找到中间结点逆置后半段比对 我们可以简单画个图来表示一下: ‘ 奇数和偶数都是可以的 找中间结点 我们可以用快慢指针来找中:l…

如何实现图片轮播(python版)

为了实现图片自动轮播,我们可以使用Python编写一个简单的脚本。首先,我们需要安装一个名为Pillow的库来处理图片。在命令行中输入以下命令进行安装: pip install Pillow 接下来,我们编写一个名为image_slideshow.py的脚本&#x…

leetcode.884——字符串分割(substr),哈希(unordered_map)的练习

884. 两句话中的不常见单词 句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。 如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。 给你两个 句子 s1 和 s2 ,返回所有 不常用…