Condition版的生产者和消费者模式
  threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作
  threading.Condition 实际上是继承threading.Lock

  acquire:上锁。
  release:解锁。
  wait:将当前线程处于等待状态,并且会释放锁。可以被其他线程使用notify和notify_all函数唤醒。被唤醒后会继续等待上锁,上锁后继续执行下面的代码。
  notify:通知某个正在等待的线程,默认是第1个等待的线程。
  notify_all:通知所有正在等待的线程。notify和notify_all不会释放锁。并且需要在release之前调用

  gLoad = threading.Condition()

'''
Condition版的生产者和消费者模式
''' import threading
import random
import time gMoney = 1000 # 原始金额
gLoad = threading.Condition()
gTime = 0 # 生产次数 class Producer(threading.Thread):
def run(self):
global gMoney
global gTime
while True:
gLoad.acquire()
if gTime < 10:
gTime += 1
money = random.randint(50,500)
gMoney += money
print("生产线程%s生成了%d元,剩余%d元"%(threading.current_thread(),money,gMoney)) else:
gLoad.release()
break
gLoad.notify_all() # 通知所有阻塞的线程,在释放锁之前
gLoad.release()
time.sleep(2) class Consumer(threading.Thread):
def run(self):
global gMoney
global gTime
while True:
gLoad.acquire()
money = random.randint(100,1000)
while money > gMoney:
if gTime == 10:
gLoad.release()
return
print("消费线程%s准备消费了%d元,剩余%d元,不足" % (threading.current_thread(), money, gMoney))
gLoad.wait() # 使进程在阻塞状态,同时释放锁
gMoney -= money
print("消费线程%s消费了%d元,剩余%d元" % (threading.current_thread(), money, gMoney))
gLoad.release()
time.sleep(2) def main():
for x in range(3):
t = Consumer(name="消费者线程%s"%x)
t.start() for x in range(5):
t = Producer(name="生产者线程%s"%x)
t.start() if __name__ == '__main__':
main()

【爬虫】Condition版的生产者和消费者模式的更多相关文章

  1. 【爬虫】Load版的生产者和消费者模式

    ''' Lock版的生产者和消费者模式 ''' import threading import random import time gMoney = 1000 # 原始金额 gLoad = thre ...

  2. condition版生产者与消费者模式

    1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...

  3. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  4. 使用libuv实现生产者和消费者模式

    生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...

  5. java生产者与消费者模式

    前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...

  6. Condition实现一个生产者一个消费者

    Condition实现一个生产者一个消费者,实现一对一交替打印: import java.util.concurrent.locks.Condition; import java.util.concu ...

  7. Java多线程设计模式(2)生产者与消费者模式

    1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...

  8. java 线程并发(生产者、消费者模式)

    线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...

  9. java进阶(40)--wait与notify(生产者与消费者模式)

    文档目录: 一.概念 二.wait的作用 三.notify的作用 四.生产者消费者模式 五.举例 ---------------------------------------分割线:正文------ ...

随机推荐

  1. Flask视图之CBV示列

    from flask import views, Flask app=Flask(__name__) class loginview( views.MethodView ):   # 继承views. ...

  2. LOJ6625 时间复杂度(min_25筛)

    本人在LOJ的第三题(前两题太水不好意思说了QwQ),欢迎大家踩std. 题目链接:LOJ 题目大意:定义函数 $f$:($minp$ 表示最小质因子) $$f(x)=\begin{cases}0&a ...

  3. javascript中的作用域和变量提升

    js的运行主要分两个阶段:js的预解析和运行,预解析阶段所有的变量声明和函数定义都会提前,但是变量的赋值不会提前.

  4. centos gcc编译

    centos上面的gcc是4.x的,因为我们使用了c++17,所以想升级成最新的gcc 1. 下载源码 https://gcc.gnu.org/index.html 2. 下载下来是.tar.xz,因 ...

  5. linux 系统时间 EST CST

    早上本来要做一些实验的,基于时间的.date 查看时间,发现时间不对.用 pool.ntp.org 去同步发现时间还是一样的,并且没有报错.如是开启另外一台时间对的linux服务器进行对比.发现一个是 ...

  6. Prometheus + Consul 自动发现服务监控

    一.Prometheus支持的多种服务发现机制(常用如下) static_configs: 静态服务发现 file_sd_configs: 文件服务发现 dns_sd_configs: DNS 服务发 ...

  7. NamedParameterJdbcTemplate举例使用

    原文地址https://www.iteye.com/blog/cosmicbugs-1190279 NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以Jd ...

  8. 实现一个特殊的栈,要求push,poll , getMin方法时间复杂度都是O(N)

    借助两个栈来实现 public class GetMinStack { private Stack<Integer> stackData; private Stack<Integer ...

  9. 【chromium】 渲染显示相关概念

    DRM(Direct Rendering Manager) DRM 由两个部分组成:一是 Kernel 的子系统,这个子系统对硬件 GPU 操作进行了一层框架封装.二是提供了一个 libdrm 库,里 ...

  10. python docker api

    开启Remote API docker默认是没有开启Remote API的,需要我们手动开启.编辑/lib/systemd/system/docker.service文件, 在文件里的ExecStar ...