首页 > 系统相关 >进程间通信(生产者消费者模型)

进程间通信(生产者消费者模型)

时间:2024-01-18 20:13:04浏览次数:33  
标签:Queue get 生产者 模型 间通信 队列 进程 True

【一】进程间通信介绍

什么是进程间通信

  • 进程间通信(Inter-process Communication,IPC)是指在不同进程之间传输数据或信号的机制。由于每个进程拥有自己独立的内存空间,所以不同进程之间无法直接访问对方的变量或数据结构。因此,操作系统提供了多种IPC机制来允许进程之间共享信息和协调操作。

  • 通俗地理解,可以把进程间通信比作不同办公室之间的沟通。每个办公室(进程)有自己的空间和工作内容,但有时候它们需要交换信息或协调某些行动,这就需要特定的沟通方式(IPC机制)。

常见的IPC机制

  1. 管道(Pipes)
    • 最基本的IPC机制之一。
    • 类似于一根管道,一个进程在管道的一端输入数据,另一个进程从另一端读取数据。
    • 管道通常是单向的,为了双向通信,需要两个管道。
  2. 消息队列(Message Queues)
    • 允许不同进程发送和接收消息。
    • 每个消息都是存储在队列中的数据块,进程可以读写这些消息。

【二】队列介绍

创建队列对象的类(底层就是以管道加锁来实现)

语法:

# 语法
import queue

q = queue.Queue(maxsize)

主要方法:

  • q.put
    • 用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。
    • 如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常
    • 如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
  • q.get
    • 可以从队列读取并且删除一个元素,同样,get方法有两个可选参数:blocked和timeout。
    • 如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。
    • 如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
  • q.get_nowait()
    • 同q.get(False)
  • q.put_nowait()
    • 同q.put(False)
  • q.empty()
    • 调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。
  • q.full()
    • 调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
  • q.qsize()
    • 返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样

【三】实现进程间通信

模板

from multiprocessing import Process, JoinableQueue
import time
import random


def producer(q, name, food):
    for i in range(1, 8):
        time.sleep(random.randint(1, 2))
        q.put(food)
        print(f'厨师{name}做了{food}')


def consumer(q, name):
    while True:
        food = q.get()
        time.sleep(random.randint(1, 2))
        print(f'顾客{name}吃完了{food}')
        q.task_done()


if __name__ == '__main__':
    q = JoinableQueue()
    p1 = Process(target=producer, args=(q, '德华', '鸡蛋炒河粉'))
    p2 = Process(target=producer, args=(q, '大仙', '大肉面条'))
    c1 = Process(target=consumer, args=(q, 'hqq'), daemon=True)
    c2 = Process(target=consumer, args=(q, 'green'), daemon=True)
    p1.start()
    p2.start()
    c1.start()
    c2.start()
    p1.join()
    p2.join()
    q.join()

  • 这个模板就是以厨师做饭和顾客吃饭为例子
  • 厨师可以做饭(产生数据)----->放到餐桌(加入到队列)
  • 顾客可以在餐桌(队列)----->吃饭(拿到数据)

【四】JoinableQueue类

  • 我的理解是和Queue模块大体不差
  • 用JoinableQueue类示例出来的对象,在每次put或者get都会对管道的数据数量进行计数
  • 当task_done()执行后就会告诉告诉队列他已经从队列里面拿走了一个数据,并且已经处理完了
  • 主进程最后的q.join()就是等待队列中所有的数据被取完,然后再继续往后执行

标签:Queue,get,生产者,模型,间通信,队列,进程,True
From: https://www.cnblogs.com/Hqqqq/p/17973288

相关文章

  • 魔搭+ 函数计算_ 一键部署,缩短大模型选型到生产的距离
    引言面对魔搭ModelScope社区提供的海量模型,用户希望快速进行选型并生产使用起来,但在此之前,却一定会面临算力管理难、模型部署难等一系列问题,那么能否实现快速把选定的模型部署在云端功能强大的GPU上,由云端负责服务,扩展,保护和监控模型服务,同时免于运维和管理云上算力等基础......
  • Flink DataStream API 编程模型
    Flink系列文章第01讲:Flink的应用场景和架构模型第02讲:Flink入门程序WordCount和SQL实现第03讲:Flink的编程模型与其他框架比较第04讲:Flink常用的DataSet和DataStreamAPI第05讲:FlinkSQL&Table编程和案例第06讲:Flink集群安装部署和HA配置第07讲:Flink常见......
  • chatglmLlama模型架构对比
    ChatGPTvs.LlamaModelArchitectureComparisonInrecentyears,languagemodelshavemadesignificantprogressinthefieldofnaturallanguageprocessing.Twoprominentmodels,ChatGPTandLlama,havegainedattentionduetotheirimpressiveperformance......
  • llama模型 pytorch 加载
    Llama模型PyTorch加载![llama](简介Llama模型是一个用于图像分类的深度学习模型,它是基于PyTorch实现的。本文将介绍如何使用PyTorch加载Llama模型,并展示一个简单的图像分类示例。PyTorch简介PyTorch是一个开源的深度学习框架,它提供了丰富的工具和库,可以帮助我们构建、训练和......
  • Generative AI 新世界 | 文生图领域动手实践:预训练模型的部署和推理
    在上期文章,我们探讨了文生图(Text-to-Image)方向的主要论文解读,包括:VAE、DDPM、DDIM、GLIDE、Imagen、UnCLIP、CDM、LDM等主要扩散模型领域的发展状况。本期我们将进入动手实践环节,我会带领大家使用AmazonSageMakerStudio、AmazonSageMakerJumpStart等服务,指导您在云中快速......
  • 用ArcGIS模型构建器生成、导出Python转换空间坐标系的代码
      本文介绍在ArcMap软件中,通过创建模型构建器(ModelBuilder),导出地理坐标系与投影坐标系之间相互转换的Python代码的方法。  在GIS领域中,矢量、栅格图层的投影转换是一个经常遇见的问题;而由于地理坐标系与投影坐标系各自都分别具有很多不同的种类,且二者之间相互转换涉及到很多......
  • 测试 【子牙-writing】 大模型
    参考:姜子牙大模型系列|写作模型ziya-writing开源!开箱即用,快来认领专属你的写作小助手吧封神榜:https://github.com/IDEA-CCNL/Fengshenbang-LM姜子牙大模型:https://huggingface.co/IDEA-CCNL/Ziya-LLaMA-13B-v1.1子牙-writing大模型:https://huggingface.co/IDEA-CCNL/Ziya-......
  • 机器学习-概率图模型系列-最大熵马尔科夫模型-38
    目录MaxEntropyMarkovModelMEMM,即最大熵马尔科夫模型,属于判别式模型。最大熵模型+隐马尔可夫模型HMMM没办法加入新的特征,MEMM是判别式模型,这就允许它可以加入更多的Features。观测独立假设对应的就是朴素贝叶斯的条件独立性假设,即t+1时刻的y状态只与t时刻的y状态有关系......
  • 云原生场景下,AIGC 模型服务的工程挑战和应对
    作者:徐之浩、车漾“成本”、“性能”和“效率”正在成为影响大模型生产和应用的三个核心因素,也是企业基础设施在面临生产、使用大模型时的全新挑战。AI领域的快速发展不仅需要算法的突破,也需要工程的创新。大模型推理对基础设施带来更多挑战首先,AI商业化的时代,大模型推理训练会......
  • 云原生场景下,AIGC 模型服务的工程挑战和应对
    作者:徐之浩、车漾“成本”、“性能”和“效率”正在成为影响大模型生产和应用的三个核心因素,也是企业基础设施在面临生产、使用大模型时的全新挑战。AI领域的快速发展不仅需要算法的突破,也需要工程的创新。大模型推理对基础设施带来更多挑战首先,AI商业化的时代,大模型推理训练会......