首页 > 系统相关 >Python中的生产者-消费者模型:多进程与多线程的实践

Python中的生产者-消费者模型:多进程与多线程的实践

时间:2024-11-04 10:19:14浏览次数:6  
标签:消费者 img Python 模型 生产者 session 进程 多线程

Python中的生产者-消费者模型:多进程与多线程的实践

在现代编程中,生产者-消费者模型是一种常见的设计模式,用于处理任务队列和并发执行。Python提供了多种工具来实现这一模型,包括threading模块和multiprocessing模块。本文将通过一个实际的案例——从网页上批量下载图片——来探讨如何使用Python实现生产者-消费者模型,并结合多进程和多线程来提高效率。

生产者-消费者模型概述

生产者-消费者模型涉及两个主要角色:生产者负责生成数据,消费者负责处理数据。在多线程和多进程环境中,这个模型可以帮助我们有效地管理资源和任务队列。

场景描述

假设我们需要从一个网站批量下载图片。我们可以将任务分解为两个部分:

  1. 生产者任务:从网页上获取图片的下载地址。
  2. 消费者任务:使用这些地址下载图片。

关键技术点

  • 进程间通信:使用Queue来在进程间传递消息。
  • 多进程:使用Process来创建独立的进程。
  • 多线程:使用ThreadPoolExecutor来管理线程。

实现生产者-消费者模型

1. 生产者:获取图片下载地址

生产者进程负责发送HTTP请求,解析HTML,并提取图片的下载地址。

from multiprocessing import Queue
import requests
from lxml import etree

def get_img_src(url, q):
    session = requests.session()
    resp = session.get(url)
    tree = etree.HTML(resp.text)
    a_list = tree.xpath("//div[@id='home']/div[1]/div[2]/a")
    for a in a_list:
        srcs = a.xpath(".//img/@data-original")
        for src in srcs:
            q.put(src)  # 将图片下载地址放入队列

2. 消费者:下载图片

消费者进程从队列中取出下载地址,并下载图片。

def download_img(src):
    session = requests.session()
    file_name = src.split("/")[-1]
    img_resp = session.get(src)
    with open(file_name, mode="wb") as f:
        f.write(img_resp.content)

3. 主函数:启动多进程

在主函数中,我们创建一个队列,并启动生产者和消费者进程。

from multiprocessing import Process

def main():
    q = Queue()
    p1 = Process(target=get_img_process, args=(q,))
    p2 = Process(target=download_process, args=(q,))
    p1.start()
    p2.start()

if __name__ == '__main__':
    main()

注意事项

  • 异常处理:在实际应用中,应添加异常处理逻辑,以确保网络请求失败或数据解析错误时程序的稳定性。
  • 资源管理:确保在进程结束后正确关闭队列和线程池,以释放资源。

结论

通过使用Python的multiprocessingconcurrent.futures模块,我们可以有效地实现生产者-消费者模型,处理复杂的并发任务。这种模型不仅提高了程序的效率,还使得代码更加模块化和易于维护。在处理需要大量I/O操作的任务时,如批量下载图片,这种模型尤其有用。

标签:消费者,img,Python,模型,生产者,session,进程,多线程
From: https://blog.csdn.net/weixin_43822401/article/details/143255117

相关文章

  • python-17-包和模块-创建属于自己的python工具包
    python-17-包和模块一.说明python中的基础系列关于组织代码的基本单位就是包和模块,在真实项目中我们不可能将所有代码都写在一起,或者我们的一些工具类库等需要单独处理,方便各模块调用,怎么办?这时候包和模块就来了,可以很方便的帮我们组织代码。来开始我们今天的日拱一卒!。......
  • Python实现Tonelli-Shanks算法
    目录Python实现Tonelli-Shanks算法引言一、Tonelli-Shanks算法的理论基础1.1模平方根的定义1.2Tonelli-Shanks算法的原理1.3Tonelli-Shanks算法的复杂度二、Tonelli-Shanks算法的Python实现2.1基本实现2.2案例一:求多个模平方根2.2.1实现代码2.3案例二:应用于密码......
  • python的变量
       python的变量有 int 整型, float 浮点数(小数),  str 字符,bool 布尔型   int指整数,该变量的类型为整数   float指小数,该变量的类型为小数   str指字符,该变量的类型为字符   bool指布尔,用于判断命题的真假,判断的情况:   1,......
  • Python轴承故障诊断 (17)基于TCN-CNN并行的一维故障信号识别模型
    往期精彩内容:Python-凯斯西储大学(CWRU)轴承数据解读与分类处理Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客三十多个开源数据集|故障诊断再也不用担心数据集了!P......
  • Python轴承故障诊断 (16)高创新故障识别模型(二)
    往期精彩内容:Python-凯斯西储大学(CWRU)轴承数据解读与分类处理Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客三十多个开源数据集|故障诊断再也不用担心数据集了!P......
  • python+flask计算机毕业设计光爱之家孤儿院管理系统设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于孤儿院管理的研究,现有研究主要以孤儿院的运营模式、儿童心理关怀等为主。专门针对孤儿院管理系统,尤其是结合光爱之家这种特定模式......
  • python+flask计算机毕业设计高校学生饮食推荐系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于饮食推荐系统的研究,现有研究多以大众群体为主,专门针对高校学生这一特定群体的饮食推荐系统研究较少。在国内外,饮食推荐相关研究主......
  • python+flask计算机毕业设计国风彩妆网站(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于国风彩妆网站的研究,现有研究主要以彩妆产品本身或一般的商业网站为主,专门针对国风彩妆网站特色功能、用户体验以及文化融合等方面......