生产者消费者问题

线程与进程

时间秒杀一切 提交于 2020-02-09 00:06:56
一、线进程若干概念 1.并发:程序,任务,用户 2.多道程序设计:A_IO阻塞----->切换到B_通道----->B_IO阻塞------>切换到C_通道 3.spooling(外部设备联机并行操作):它是Simultaneous Peripheral Operations On-Line的缩写,它是关于慢速 字符设备 如何与计算机主机交换信息一种技术,通常称为“ 假脱机 技术”。原理就是当一个额外的设备送到内存等待区域时,当操作系统处理完一个事件后,额外设备中的事件可以迅速被操作系统读出,装进空出来的内存区运行。 二、实例导入: 线程:threading.Thread(target=函数名,args=形参名) import threading from time import ctime, sleep import time def ListenMusic(name): print("Berlin listening to %s. %s" %(name,ctime())) sleep(3) print("end listening %s"%ctime()) def RecordBlog(title): print("Begin recording the %s! %s"%(title,ctime())) sleep(5) 线程和进程若干方法 1.守护线程Setdaemon t1

网络并发面试集锦(1-50)

老子叫甜甜 提交于 2020-02-08 18:50:03
目录 1、python的底层网络交互模块有哪些? 2、简述OSI七层协议 3、什么是C/S和B/S架构? 4、简述TCP协议? 5、什么是arp协议? 6、tcp和UDP的区别?为什么tcp协议更可靠? 7、什么是局域网和广域网? 8、什么是socket?简述基于tcp协议的套接字通信流程? 9、什么是粘包?socket中造成粘包的原因是什么?那些情况会发送粘包现象? 10、IO多路复用的作用? 11、什么是防火墙以及作用? 12、select、poll、epoll模型的区别? 13、简述进程、线程、协程的区别以及应用场景? 14、什么是GIL全局解释器锁? 15、Python中如何使用线程池和进程池? 16、threading.local的作用? 17、进程之间二u和进行通讯? 18、什么是并发和并行? 19、同步和异步,阻塞和非阻塞的区别? 20、路由器和交换机的区别? 21、什么是域名解析? 22、如何让修改本地的hosts文件? 23、生产者和消费者模型应用场景? 24、什么是cdn服务? 25、有A.txt和B.txt两个文件,使用多进程和进程池的方式分别读取这两个文件? 26、那些是常见的TCPFlags? 27、tracerroute--一般使用的是哪种网络层协议? 28、iptabkes只是考察,根据要求写出防火墙规则? 29、socket套接字编程? 30

生产者消费者问题

一世执手 提交于 2020-02-08 17:54:21
思路: 生产者判读是否大于20: 若 否,则生产一个产品并且唤醒(消费者).若是,则堵塞. 消费者判读是否大于0,若是,则消费一个产品,并唤醒(生产者).若否,则堵塞. 我们将生产和消费的方法,放到店员类,这样可以操作共享数据. package com.LearnJava.Thread; class Clerk { private int products=0; public synchronized void prodectOne(){ if(products<20){ products++; System.out.println(Thread.currentThread().getName()+"生产第"+products+"个产品"); notifyAll(); }else { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void consumeOne(){ if(products>0){ System.out.println(Thread.currentThread().getName()+"消费第"+products+"个产品"); products--; notifyAll(); }else { try { wait();

Cpython支持的进程与线程(Day33)

萝らか妹 提交于 2020-02-08 02:54:31
一、multiprocessing模块介绍 python中的多线程无法利用CPU资源,在python中大部分情况使用多进程。python中提供了非常好的多进程包 multiprocessing。 multiprocessing 模块用来开启子进程,并在子进程中执行功能(函数),该模块与多线程模块threading的编程接口类似。 multiprocessing 的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。 二、Process类的介绍 1.创建进程的类 Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动) 强调: 1. 需要使用关键字的方式来指定参数 2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号 2.参数介绍 group参数未使用,值始终为None target表示调用对象,即子进程要执行的任务 args表示调用对象的位置参数元组,args=(1,2,'egon',) kwargs表示调用对象的字典,kwargs={'name':'egon','age':18} name为子进程的名称 3.方法介绍 p.start():启动进程,并调用该子进程中的p

数据结构之队列的使用 + 面试题

ε祈祈猫儿з 提交于 2020-02-07 14:05:15
数据结构之队列的使用 + 面试题 队列(Queue):与栈相对的一种数据结构, 集合(Collection)的一个子类。队列允许在一端进行插入操作,而在另一端进行删除操作的线性表,栈的特点是后进先出,而队列的特点是先进先出。队列的用处很大,比如实现消息队列。 Queue 类关系图,如下图所示: 注:为了让读者更直观地理解,上图为精简版的 Queue 类关系图。本文如无特殊说明,内容都是基于 Java 1.8 版本。 队列(Queue) 1)Queue 分类 从上图可以看出 Queue 大体可分为以下三类。 双端队列:双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取。 阻塞队列:阻塞队列指的是在元素操作时(添加或删除),如果没有成功,会阻塞等待执行。例如,当添加元素时,如果队列元素已满,队列会阻塞等待直到有空位时再插入。 非阻塞队列:非阻塞队列和阻塞队列相反,会直接返回操作的结果,而非阻塞等待。双端队列也属于非阻塞队列。 2)Queue 方法说明 Queue 方法如下图所示: 其中比较常用的方法有以下几个: add(E):添加元素到队列尾部,成功返回 true,队列超出时抛出异常; offer(E):添加元素到队列尾部,成功返回 true,队列超出时返回 false; remove(Object):删除元素,成功返回 true

Linux-0.11操作系统实验5-信号量的实现和应用

天大地大妈咪最大 提交于 2020-02-04 14:35:29
实验环境: 信号量的实现和应用 实验任务: 在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题; 在 linux-0.11 中实现信号量,用生产者—消费者程序检验之。 用信号量解决生产者—消费者问题 实验要求: pc.c 程序需打开一个文件 buffer.txt 作为共享缓冲区,缓冲区同时最多只能保存 10 个数;创建一个生产者进程和N个消费者进程,其中生产者进程向缓冲区写入连续的整数,0,1,2,……,M,M>=500;消费者进程从缓冲区依次读取数字,每次读一个,并将读出的数字从缓冲区删除,然后将本进程 ID 和数字输出到标准输出。 为什么要有信号量? 对于生产者 来说,当缓冲区满,也就是空闲缓冲区个数为0时,此时生产者不能继续向缓冲区写数,必须等待,直到有消费者从满缓冲区取走数后,再次有了空闲缓冲区,生产者才能向缓冲区写数。 对于消费者 来说,当缓冲区空时,此时没有数可以被取走,消费者必须等待,直到有生产者向缓冲区写数后,消费者才能取数。并且如果当缓冲区空时,先后有多个消费者均想从缓冲区取数,那么它们均需要等待,此时需要记录下等待的消费者的个数,以便缓冲区有数可取后,能将所有等待的消费者唤醒,确保请求取数的消费者最终都能取到数。 也就是说,当多个进程需要协同合作时,需要根据某个信息,判断当前进程是否需要停下来等待;同时,其他进程需要根据这个信息判断是否有进程在等待

生产者消费者问题

时间秒杀一切 提交于 2020-01-29 17:44:54
问题描述 /** * 经典生产者与消费者问题 * 生产者不断的往仓库中存放产品,消费者从仓库中消费产品。 * 其中生产者和消费者都可以有若干个。 * 仓库规则:容量有限,库满时不能存放,库空时不能取产品 。 */ 产品 package product; /** * 商品 */ public class Product { private int id; private String name; public Product(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Product{" + "id=" + id + ", name='" + name + '\'' + '}'; } } 生产者 package product; import java.util.Random;

生产者消费者模型 线程相关

冷暖自知 提交于 2020-01-28 11:41:43
知识点补充: 1、操作系统的调度算法: 时间片轮转法 多级反馈队列 2、同步异步(任务的提交方式): 同步:提交任务之后原地等待任务的返回结果,才能进行下一步操作 异步:提交任务之后不等待任务的返回结果,直接进行下一步操作 3、阻塞非阻塞 阻塞:程序处于阻塞态 非阻塞:程序处于运行或就绪态 4、进程理论: 进程:正在运行的程序 多道技术: 空间上的复用 多个程序共用一套硬件设备 时间上的复用 CPU来回切换:切换+保存状态 1、程序占用cpu时间过长会被操作系统强行剥夺走cpu的执行权限 2、程序的IO操作指的是: input 网络请求(recv accept) time.sleep 文件读写 print 5、创建进程的本质:在内存中申请一块独立的内存空间,需要申请内存空间,还需要拷贝代码    #1、进程间通信 #队列:先进先出 #堆栈:先进后出 #利用队列实现进程间通信 from multiprocessing import Queue q = Queue(5) #里面的参数代表最多放5个数据 q.put(1) #往队列里放数据 q.put(1) q.put(1) q.put(1) print(q.full()) #判断队列是否放满了,此时显示False,还有一个位置没放数据 q.put_nowait(2) #往队列里放数据, # q.put_nowait(2)

生产者消费者模型(重要)

99封情书 提交于 2020-01-28 09:31:42
生产者消费者模型介绍   生产者指的是生产数据的任务,消费者指的是处理数据的任务。 在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题,引入了生产者和消费者模式。 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯。所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。 这个阻塞队列就是用来给生产者和消费者解耦的 生产者消费者模型实现 from multiprocessing import Process,Queue import time def producer(q): for i in range(5): res = "包子%s" % i time.sleep(0.5) print("生产者生产了%s" % res) q.put(res) def consumer(q): while True: res = q.get() time.sleep(1) print("消费者吃了%s" % res) if __name__ == "__main__

生产者消费者模式的简单实现

混江龙づ霸主 提交于 2020-01-25 07:41:05
实例实现: 生产者生产两种商品,消费者取走两种商品 产生的问题及解决: 数据错乱---->线程同步 重复生产和重复取------>线程间的通信 线程间通信的方法 wait() :调用了 wait()方法的线程进入等待池进行等待,等待池中的线程不去竞争对象锁,直到其它的线程通知,才会进入锁池 notify() :随机唤醒一个在该对象上等待的线程,被唤醒的线程进行锁池,开始竞争该对锁上的锁 notifyAll() :唤醒所有在该对象上等待的线程优先级高的线程有可能先竞争到对象锁只能在同步方法和同步代码块中使用 商品类,可以设置商品名称和品牌,有存入和取走方法 1 public class Goods { 2 private String name;//名称 3 private String brand;//品牌 4 private boolean isFlag;//用于标识是否有商品 ,假设为true时代表有商品,false时代表没有商品 5 public String getName() { 6 return name; 7 } 8 public void setName(String name) { 9 this.name = name; 10 } 11 public String getBrand() { 12 return brand; 13 } 14 public void