生产者消费者问题

《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池

倖福魔咒の 提交于 2019-12-26 03:41:17
一、进程间通信---队列和管道(multiprocess.Queue、multiprocess.Pipe)   进程间通信: IPC (inter-Process Communication) 1、队列 概念介绍:   创建共享的进程队列,Queue是多进程的安全的队列,可以使用Queue实现多进程之间的数据传递。 # Queue([maxsize]) 创建共享的进程队列。 参数 :maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。 底层队列使用管道和锁定实现。 # Queue([maxsize]) 创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。另外,还需要运行支持线程以便队列中的数据传输到底层管道中。 Queue的实例q具有以下方法: q.get( [ block [ ,timeout ] ] ) 返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。block用于控制阻塞行为,默认为True. 如果设置为False,将引发Queue.Empty异常(定义在Queue模块中)。timeout是可选超时时间,用在阻塞模式中。如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。 q.get_nowait( ) 同q.get(False)方法。 q.put

Python并发编程一(多进程)

那年仲夏 提交于 2019-12-23 21:47:58
1.背景知识(进程、多道技术) 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。 了解操作系统,详见: https://www.cnblogs.com/JackLi07/p/9226851.html #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理、调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景:针对单核,实现并发 ps: 现在的主机一般是多核,那么每个核都会利用多道技术 有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个 cpu中的任意一个,具体由操作系统调度算法决定。 2.空间上的复用:如内存中同时有多道程序 3.时间上的复用:复用一个cpu的时间片 强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样 才能保证下次切换回来时,能基于上次切走的位置继续运行 2.python并发编程之多进程(理论)   进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 2.1进程与程序的区别   程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。   需要强调的是

进程.线程

大城市里の小女人 提交于 2019-12-23 07:10:24
目录:      进程        子进程        僵尸孤儿        进程隔离        属性方法        守护进程        互斥锁        进程池        进程通信        抢票        生产者消费者      线程        守护线程        常用方法               互斥锁        死锁        递归锁        线程池        线程通讯:event        信号量 进程与线程配图: 为什么说多线程适合IO密集型任务,而多进程适合计算密集型任务? IO密集型主要是要在遇到IO时候去尽快的进行切换,而多线程的切换速度快; 计算密集型主要是需要使用CPU的资源,而进程是运行的程序,主要是在使用CPU; 线程=》单指代码的执行过程进程-》资源的申请与销毁的过程 进程 : 进程指的就是一个正在运行的程序,或者说是程序的运行过程,即进程是一个抽象的概念.进程之间数据不共享. 进程是起源于操作系统的,是操作系统最核心的概念,操作系统所有其他的概念都是围绕进程展开的 串行:一个任务完完整运行完毕,才执行下一个 并发:多个任务看起来是同时运行的,单核就可以实现并发.本质是不停切换,随机进行 并行:多个任务是真正意义上的同时运行,只有多核才能实现并行 阻塞: 遇到I/O操作

python 进程 线程

一笑奈何 提交于 2019-12-23 07:08:01
1.概念 进程 线程 # 进程 就是一个程序在一个数据集上的一个动态执行过程 是最小的资源单元 # 进程是由 程序 数据集 进程控制块组成 本质上是一段程序的运行过程 # 1. 一个程序至少有一个进程,一个进程至少有一个线程.(进程可以理解成线程的容器) # # 2. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 # # 3. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和 # 程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 # # 4. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. # 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程 # 自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)但是 # 它可与同属一个进程的其他的线程共享进程所拥有的全部资源. # 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. # 线程 :降低上下文切换的消耗 提高系统的并发性 是最小执行单元 # python GIL # 无论你启多少个线程,你有多少个cpu,

为什么object.wait()、object.notify()一定要放在synchronized代码块内?

房东的猫 提交于 2019-12-23 05:36:38
相信大多数人对object.wait()和object.notify()都非常熟悉,最经典的生产者-消费者模型就可以基于wait-notify机制来实现的,那么在编写代码的时候发现,JDK要求对object.wait()和object().notify方法必须在synchronized代码块内部使用,否则运行时会抛出IllegalMonitorStateException异常。那么为什么JDK要对此做限制呢? 要想知道为什么要加此限制,就得知道不加此限制会发生什么非预期的问题。如果不加这个限制,一个简单的生产者-消费者模型的实现如下:当count为0的时候,生产者进行生产操作,并将count+1,然后调用notify()方法通知;当count为0时,消费者会调用wait()方法进行等待。(至于为什么消费者中要用while()方法,我们在后文介绍) private int count = 0; private Object obj; public void producer(){ if (count == 0){ //省略生产逻辑 count++; obj.notify(); } } public void consumer(){ while (count == 0){ obj.wait(); } //省略消费逻辑 } 乍一看,通过上述代码实现了生产者-消费者的功能,但是仔细一想

生产者消费者问题虚假唤醒

て烟熏妆下的殇ゞ 提交于 2019-12-23 00:30:32
生产者消费者问题演示及解决 问题一: package com . mock ; import org . junit . jupiter . api . Test ; public class TestProducerAndConsumer { @Test public void test ( ) { Product p = new Product ( ) ; new Thread ( new Producer ( p ) , "生产者1" ) . start ( ) ; new Thread ( new Consumer ( p ) , "消费者1" ) . start ( ) ; } } class Producer implements Runnable { private Product product ; public Producer ( Product product ) { this . product = product ; } @Override public void run ( ) { for ( int i = 0 ; i < 10 ; i ++ ) { product . produce ( ) ; } } } class Consumer implements Runnable { private Product product ; public

Java编程的逻辑 (67) - 线程的基本协作机制 (上)

╄→尐↘猪︶ㄣ 提交于 2019-12-22 03:37:02
​ 本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接 : http://item.jd.com/12299018.html 上节 介绍了多线程之间竞争访问同一个资源的问题及解决方案synchronized,我们提到,多线程之间除了竞争,还经常需要相互协作,本节就来介绍Java中多线程协作的基本机制wait/notify。 都有哪些场景需要协作?wait/notify是什么?如何使用?实现原理是什么?协作的核心是什么?如何实现各种典型的协作场景?由于内容较多,我们分为上下两节来介绍。 我们先来看看都有哪些协作的场景。 协作的场景 多线程之间需要协作的场景有很多,比如说: 生产者/消费者协作模式:这是一种常见的协作模式,生产者线程和消费者线程通过共享队列进行协作,生产者将数据或任务放到队列上,而消费者从队列上取数据或任务,如果队列长度有限,在队列满的时候,生产者需要等待,而在队列为空的时候,消费者需要等待。 同时开始:类似运动员比赛,在听到比赛开始枪响后同时开始,在一些程序,尤其是模拟仿真程序中,要求多个线程能同时开始。 等待结束:主从协作模式也是一种常见的协作模式,主线程将任务分解为若干个子任务,为每个子任务创建一个线程

java 线程(三) wait和notify方法

﹥>﹥吖頭↗ 提交于 2019-12-22 03:34:37
1.wait和notify相关概念: wait和notify方法是Java同步机制中重要的组成部分, 这些方法只有在Synchronized方法或Synchronized代码块中才能使用 否者就会报java.lang.IllegalMonitorStateExceprion异常 当Synchronized方法或者Synchronized代码块中的wait() 方法被调用时,当前线程将被中断运行,并且放弃该对象锁 当例外的线程执行了某个对象notify()方法后,会唤醒在此对象等待池中的某个线程使之成为可运行的(就绪状态)线程。 notifuAll()方法会唤醒所有等待这个对象的线程使之成为可运行的线程。 2.下面通过一个比较经典的问题来讲解着两个方法: 问题描述:生产者将产品交给店员,,而消费者从店员处取走产品,店员一次只能持有固定数量的产品,如果生产者生产了过多的产品, 店员会叫生产者等一下;若果店中的有空位放产品了在通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品 再通知生产者来取走产品。这里可能出现的问题有以下两个: 生产者比消费者快时,消费者会漏掉一些数据没有取到 消费者比生产者快时,消费者会取相同的数据 3.代码如下:    1 public class ProductTest { 2 3 /** 4 * @param args 5 */ 6

第九章.并发编程

落爺英雄遲暮 提交于 2019-12-21 14:25:22
第九章 并发编程 9.1操作系统简介 9.1.1手工操作 -穿孔卡片 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。 手工操作的两个特点: 用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。 CPU 等待手工操作。CPU的利用不充分。 人机矛盾 20世纪50年代后期,出现 人机矛盾 :手工操作的慢速度和计算机的高速度之间形成了尖锐矛盾,手工操作方式已严重损害了系统资源的利用率(使资源利用率降为百分之几,甚至更低)。 解决办法 : 摆脱人的手工操作,实现作业的自动过渡 , 这样就出现了成 批处理 。 9.1.2 批处理 - 磁带存储 批处理系统 加载在计算机上的一个 系统软件 ,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(包括程序、数据和命令)。 特点 : 提高cpu的利用率 , 降低数据的读取时间 不足 每次主机内存中仅存放一道作业,每当它运行期间发出输入/输出(I/O)请求后,高速的CPU便处于等待低速的I/O完成状态,致使CPU空闲。

两个线程一个生产者个一个消费者

我是研究僧i 提交于 2019-12-20 20:30:50
需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用标记或加锁机制 wait() / nofity() 方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制。 wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行。 notify()方法:当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。 代码实现(共三个类和一个main方法的测试类) Resource.java /** * Created by yuandl on 2016-10-11./** * 资源 */ public class Resource { /*资源序号*/ private int number = 0; /*资源标记*/ private boolean flag = false; /** * 生产资源 */ public synchronized void create() { if (flag) {//先判断标记是否已经生产了,如果已经生产,等待消费; try { wait();//让生产线程等待 } catch