进程_线程 之(五) --- 生产者消费者

同步锁

acquire([timeout])/release():  调用关联的锁的相应方法。 
wait([timeout]):   调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。 
notify():   调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。 
notifyAll():   调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常

生产者消费者

1 import threading
2 from time import sleep
3
4 products = 0 # 定义一个产品变量
5 condition = threading.Condition() # 创建一个同步锁。为了保证生产者在生产过程中,消费者不去消费。不能让消费者去消费还在生产的产品
6 # lock = threading.Lock()
7 # 如果既有读又有写(生产者和消费者模式),不能加互斥锁,容易造成死锁
  • 生产者
 1 # 定于一个生产者类
 2 class Producter(threading.Thread):  # 继承自threading.Thread。重写线程类
 3     ix = [0] # 生产者的实例个数
 4
 5     def __init__(self,):
 6         super().__init__()
 7         self.ix[0] += 1
 8         self.setName("生成者" + str(self.ix[0]))
 9
10     def run(self):
11         global products
12         while True:
13             if condition.acquire(): # 加同步锁
14                 if products < 10:
15                     products += 1
16                     print("%s:库存少于10个,努力生产件产品,现在产品的总量为:%d"%(self.getName(),products))
17                 else:
18                     print("%s:库存多于10个,不需要继续生产,现在产品的总量为:%d"%(self.getName(),products))
19                     condition.wait() # 等待一下
20                 condition.release()
21                 sleep(2)
  • 消费者
 1 # 定义一个消费者
 2 class Consumer(threading.Thread):
 3     ix = [0]
 4
 5     def __init__(self):
 6         super().__init__()
 7         self.ix[0] += 1
 8         self.setName("消费者"+str(self.ix[0]))
 9
10     def run(self):
11         global products
12         while True:
13             if condition.acquire(): # 加同步锁
14                 if products > 1:
15                     products -= 1
16                     print("%s:我消费了1个产品,现在产品的数量为:%d"%(self.getName(),products))
17                 else:
18                     print("%s:就剩1个产品了,我将停止消费,现在产品的数量为:%d" % (self.getName(), products))
19                     condition.wait() #  锁等一下
20                 condition.release()
21                 sleep(2)
  • 调用
1 if __name__ == ‘__main__‘:
2     for _ in range(2):
3         p = Producter()
4         p.start()
5     for _ in range(10):
6         c = Consumer()
7         c.start()
  • 结果
 1 """
 2 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:1
 3 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:2
 4 消费者1:我消费了1个产品,现在产品的数量为:1
 5 消费者2:就剩1个产品了,我将停止消费,现在产品的数量为:1
 6 消费者3:就剩1个产品了,我将停止消费,现在产品的数量为:1
 7 消费者4:就剩1个产品了,我将停止消费,现在产品的数量为:1
 8 消费者5:就剩1个产品了,我将停止消费,现在产品的数量为:1
 9 消费者6:就剩1个产品了,我将停止消费,现在产品的数量为:1
10 消费者7:就剩1个产品了,我将停止消费,现在产品的数量为:1
11 消费者8:就剩1个产品了,我将停止消费,现在产品的数量为:1
12 消费者9:就剩1个产品了,我将停止消费,现在产品的数量为:1
13 消费者10:就剩1个产品了,我将停止消费,现在产品的数量为:1
14 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:2
15 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3
16 消费者1:我消费了1个产品,现在产品的数量为:2
17 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:3
18 消费者1:我消费了1个产品,现在产品的数量为:2
19 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3
20 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:4
21 消费者1:我消费了1个产品,现在产品的数量为:3
22 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:4
23 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:5
24 消费者1:我消费了1个产品,现在产品的数量为:4
25 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:5
26 """

原文地址:https://www.cnblogs.com/TMMM/p/11380501.html

时间: 2024-08-27 17:35:44

进程_线程 之(五) --- 生产者消费者的相关文章

进程,互斥锁,生产者消费者,线程

进程,互斥锁,生产者消费者,线程 一.僵尸进程与孤儿进程 代码演示 ''' 僵尸进程(有坏处): - 在子进程结束后,主进程没有正常结束,子进程的PID不会被回收. 缺点: - 操作系统中PID号是有限的,比如子进程PID号无法正常回收,则会占用PID号. - 资源浪费 - 若PID号满了,则无法创建新的进程. 孤儿进程(没有坏处): - 在子进程没有结束时,主进程没有"正常结束",子进程PID不会被回收. - 操作系统优化机制(孤儿院): 当主进程意外终止,操作系统会检测是否有正在运

Linux线程编程之生产者消费者问题

前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队).新元素入队后成为新的队尾元素,元素出队后其后继元素就成为队首元素. 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2 ElemType elem[M

11.9-全栈Java笔记: 线程并发协作(生产者/消费者模式)

多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型"生产者消费者模式". 什么是生产者? 生产者指的是负责生产数据的模块(这里模块可能是:方法.对象.线程.进程). 什么是消费者? 消费者指的是负责处理数据的模块(这里模块可能是:方法.对象.线程.进程). 什么是缓冲区? 消费者不能直接使用生产者的数据,它们之间有个"缓冲区".生产者将生产好的数据放入"缓冲区",消费者从"缓冲区"

线程安全的生产者消费者四种实现方法

问题描述 在IT技术面试过程中,我们经常会遇到生产者消费者问题(Producer-consumer problem), 这是多线程并发协作问题的经典案例.场景中包含三个对象,生产者(Producer),消费者(Consumer)以及一个固定大小的缓冲区(Buffer).生产者的主要作用是不断生成数据放到缓冲区,消费者则从缓冲区不断消耗数据.该问题的关键是如何线程安全的操作共享数据块,保证生产者线程和消费者线程可以正确的更新数据块,主要考虑 1. 生产者不会在缓冲区满时加入数据. 2. 消费者应当

线程同步之生产者消费者

前言: 前面因时间关系,未将“生产者消费者问题”实例的介绍发布在博客随笔中,故本文作为对之前“多线程”一文的补充.概念: 生产者消费者问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.这个案例中主要实现的是两个角色协同对同一资源进行访问.生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗这些数据.该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据. 设计:本博客前面关于多线程的文

11.python并发入门(part8 基于线程队列实现生产者消费者模型)

一.什么是生产者消费者模型? 生产者就是生产数据的线程,消费者指的就是消费数据的线程. 在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据,相对的,如果消费者处理数据的速度大于生产者,那么消费者就必须等待生产者. 为了解决这种问题,就有了生产者消费者模型. 生产者与消费者模型,是通过一个容器,来解决生产者和消费者之间的耦合性问题,生产者和消费者之间并不会直接通信,这样生产者就无需等待消费者处理完数据,生产者可以直接把数据扔给队列,这个

基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)

需求背景 利用线程来模拟生产者和消费者模型 系统建模 这个系统涉及到三个角色,生产者,消费者,任务队列,三个角色之间的关系非常简单,生产者和消费者拥有一个任务队列的引用,生产者负责往队列中放置对象(id),消费者负责从队列中获取对象(id),其关联关系如下 方案1 因为是多线程操作,所以对任务的存取都要使用线程同步加锁机制,看一下我们的TaskQueue类,两个主方法都加了synchronized修饰,这就意味着,一个时间点只可能有一个线程对这个方法进行操作 TaskQueue类代码 [java

python 归纳 (十四)_队列Queue实现生产者消费者

# -*- coding: UTF-8 -*- """ 多线程的生产者,消费者 使用队列Queue """ import Queue import threading import time import random queue = Queue.Queue(3) # 创建3个大小的队列 class Producer(threading.Thread): """ 生产者,往队列中写数据 ""&qu

Linux下进程的同步互斥实例——生产者消费者

linux下的同步和互斥 Linux sync_mutex 看的更舒服点的版本= = https://github.com/Svtter/MyBlog/blob/master/Linux/pthread/Linux_producer_consumer.md Semaphore.h 一份好文档,胜读十年书 本文参考了诸多资料,百度百科,cplusplus等 首先介绍一个头文件 #include <semaphore.h> 这里面包含了大多数的所需要使用的信号量. 包含: int sem_init