Python并行编程(九):线程通讯queue】的更多相关文章

1.基本概念 当线程之间要共享资源或数据的时候,可能变的非常复杂.Python的threading模块提供了很多同步原语,包括信号量,条件变量,事件和锁.如果可以使用这些原语的话,应该优先考虑使用这些,而不是使用queue模块.队列操作起来更容易,也使多线程编程更安全,因为队列可以将资源的使用通过单线程进行完全控制,并且允许使用更加整洁和可读性更高的设计模式. Queue常用的方法有以下四个: - put():往queue中放一个item - get():从queue删除一个item,并返回删除…
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进程 前言 进程的出现是为了更好的利用CPU资源使到并发成为可能. 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费.聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行.注意关键字切换…
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间.但从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolE…
python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同步非阻塞 调用函数必须等待结果\cpu工作-调用了一个高计算的函数stripeval('1+2+3')sum max min sorted 异步阻塞 调用函数不需要立即获取结果,而是继续做其他的事情,在获取结果的时候不知道先获取谁的,但是总之需要等(阻塞) 异步非阻塞 调用函数不需要立即获取结果,也…
1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行.多线程可以利用共享内存空间共享数据和资源.线程和进程的具体实现取决于你要运行的操作系统,但是总体来讲,我们可以说线程是包含在进程中的,同一个进程的多个不同的线程可以共享相同的资源,而进程之间不会共享资源. 每一个线程基本上包含3个元素:程序计数器,寄存器和栈.与同一进程的其他线程共享的资源基本上包括…
一.基于线程的并行编程 如何使用Python的线程模块 如何定义一个线程 如何探测一个线程 如何在一个子类中使用线程 Lock和RLock实现线程同步 信号实现线程同步 条件(condition)实现线程同步 事件(event)实现线程同步 如何使用with语句 使用队列实现线程消息传递 如何评估多线程应用的性能 兑现成编程的危险 二.基于进程的并行编程 如何使用Python的multiprocessing模块 如何生成一个进程 如何命名一个进程 如何在后台运行一个进程 如何杀死一个进程 如何在…
一.编程思想 并行编程的思想:分而治之,有两种模型 1.MapReduce:将任务划分为可并行的多个子任务,每个子任务完成后合并得到结果 例子:统计不同形状的个数. 先通过map进行映射到多个子任务,分别统计个数,然后在用reduce进行归纳一下. 2.流水:将任务分为串行的多个子任务,每个子任务并行.ProductConsume 例子: 多个生产者进行并行,多个消费者进行并行.生产者生产出来东西放到队列里:队列里有东西时,消费者就可以进行消费,这样双方没有太大的依赖关系. 为什么要并行编程呢?…
1.基本概念 除了顺序执行和并行执行的模型以外,还有异步模型,这是事件驱动模型的基础.异步活动的执行模型可以只有一个单一的主控制流,能在单核心系统和多核心系统中运行. 在并发执行的异步模型中,许多任务被穿插在同一时间线上,所有的任务都由一个控制流执行(单一线程).任务的执行可能被暂停或恢复,中间的这段时间线程将会执行其他任务.大致如下: 如上图所示,任务(不同的颜色表示不同的任务)可能被其他任务插入,但是都处在同一个线程下.这表明当某一个任务执行的时候,其他任务都暂停了.与多线程编程模型很大的一…
1.线程和进程 进程是应用程序的一个执行实例,比如,在桌面上双击浏览器将会运行一个浏览器.线程是一个控制流程,可以在进程内与其他活跃的线程同时执行.控制流程指的是顺序执行一些机器指令.进程可以包含多个线程,所以开启一个浏览器,操作系统将创建一个进程,并开始执行这个进程的主线程.每一个线程将独立执行一系列的指令,通常是一个函数,并且和其他线程并行执行.然而,同一个进程内的线程可以共享一些地址空间和数据结构.线程也被称作轻量进程,因为它和进程有许多共同点,比如都是可以和其他控制流程同时运行的控制流程…
计算机科学的研究,不仅应该涵盖计算处理所基于的原理,还因该反映这些领域目前的知识状态.当今,计算机技术要求来自计算机科学所有分支的专业人员理解计算机处理的基础的关键,在于知道软件和硬件在所有层面上的交互. 直到现在,程序员可以依赖于硬件设计者,编译器和芯片厂商,来使他们的软件程序运行更快或者更有效,而无须改变他们的程序.但是,在实际中,如果一个程序运行的更快,它肯定是一个并行程序.尽管很多研究者的目标是保证程序员在编写他们的程序的时,无需注意硬件的并行特征,但是,要实现这一点,还将需要很多年的时…
一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 from threading import Thread,Lock import time mutexA=Lock() mutexB=Lock() class MyThread(Thread):…
线程queue 线程之间已经是共享数据的,为什么还使用线程queue? 线程需要自己加锁,线程queue帮我们处理好加锁的问题 有三种不同的用法 第一种方法: class queue.Queue(maxsize=0) #队列:先进先出 put('four',block=,timeout=) 第一个参数: 放入的数据 第二个参数: block=True 时 队列满了,再放数据不抛出异常,程序卡主,不指定block参数,默认是True block=false时,队列满了,再放数据,不阻塞,抛出异常…
1.基本概念 事件是线程之间用于通讯的对象.有的线程等待信号,有的线程发出信号.基本上事件对象都会维护一个内部变量,可以通过set方法设置为true,也可以通过clear方法设置为false.wait方法将会阻塞线程,直到内部变量为true. 2.使用用例 # coding : utf-8 import time from threading import Thread, Event import random items = [] event = Event() class consumer(…
1.基本概念 信号量是由操作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用.本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取. 同样在threading中,信号量有acquire和release两个函数. - 每当线程想要读取关联了信号量的共享资源时,必须调用acquire,此操作减少信号量的内部变量,如果此变量的值非负,那么分配该资源的权限.如果是负值,那么线程被挂起,直到有其他的线程释放资源. - 当线程不再需要该共享资源,必须通过release释放,…
1.基本概念 条件指的是应用程序状态的改变.其中某些线程在等待某一条件发生,其 他线程会在该条件发生的时候进行通知,一旦条件发生,线程会拿到共享资源的唯一权限. 2.示例代码 from threading import Thread, Condition import time items = [] condition = Condition() class consumer(Thread): def __init__(self): Thread.__init__(self) def consu…
1.基本概念 如果想让只有拿到锁的线程才能释放该锁,那么应该使用RLock()对象.当需要在类外面保证线程安全,又要在类内使用同样方法的时候RLock()就很使用. RLock叫做Reentrant Lock,就是可以重复进入的锁,也叫递归锁.这种锁对比Lock有三个特点:1.谁拿到锁,谁释放:2.同一线程可以多次拿到该锁:3.acquire多少次就必须release多少次,只有最后一次release才能改变RLock的状态为unlocked. 2.RLock示例代码 # coding:utf-…
1.基础概念 当两个或以上对共享内存操作的并发线程中,如果有一个改变数据,又没有同步机制的条件下,就会产生竞争条件,可能会导致执行无效代码.bug等异常行为. 竞争条件最简单的解决方法是使用锁.锁的操作非常简单,当一个线程需要访问部分共享内存时,它必须先获得锁才能访问.此线程对这部分共享资源使用完成之后,释放锁,然后其他线程才可再次获得锁并访问这部分资源. 然而,在实际使用中,这个方法经常导致死锁现象.当不同线程要求得到同一个锁时,死锁就会发生,此时程序不会继续执行,因为他们互相拿着对方需要的锁…
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据集:数据集则是程序在执行过程中所需要使用的资源 3.进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感 知进程存在的唯一标志. 二.线程                                                  …
1.基本概念 多进程主要用multiprocessing和mpi4py这两个模块. multiprocessing是Python标准库中的模块,实现了共享内存机制,可以让运行在不同处理器核心的进程能读取共享内存. mpi4py库实现了消息传递的编程范例(设计模式).简单来说就是进程之间不靠任何共享信息来进行通讯,所有的交流都通过传递信息代替. 这与使用共享内存通讯.加锁或类似机制实现互斥的技术形成对比.在信息传递的代码中,进程通过send和receive进行交流. 2.创建一个进程 由父进程创建…
一.socketserver模块 之前的例子中的C/S架构只能实现同一时刻只有一台客户端可以和服务端进行数据交互,我们可以通过socketserver模块实现并发. 基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环.socketserver模块分为两大类,server类解决链接问题,request解决通信问题. server类: request类: 继承关系: 基于socketserver完成并发: import socketserver#这个模块解决了并发的问题 #Ftpser…
大家好,并发编程 进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 . 前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程无非就是创建一下,然后再start()下,实在是太简单了. 可是要知道,在真实的项目中,实际场景可要我们举的例子要复杂的多得多,不同线程的执行可能是有顺序的,或者说他们的执行是有条件的,是要受控制的.如果仅仅依靠前面学的那点浅薄的知识,是远远不够的. 那今天,我们就来探讨一下如何控制线程的触发执行.…
引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间.但从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,对…
操作系统线程理论 参考资料:http://www.cnblogs.com/Eva-J/articles/8306047.html 线程和python 理论知识 全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可以“运行”多个线程,但在任意时刻只有一个线程在解释器中运行. 对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个…
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间.但从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和m…
什么是进程.进程的概念? 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间, 一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stack region). 文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之), 它才能成为一个活动的实体,我们称其为…
一. 线程: 基本使用 线程锁 线程池 队列(生产者消费者模型) 二. 进程:  基本使用  进程锁 进程池 进程数据共享 三. 协程: gevent greenlet 四. 缓存: memcache (一)线程: 所有的线程都运行于一个进程中,一个进程中可以执行多个线程.多个线程共享进程内的资源.所以可以将线程可以看成是共享同一虚拟内存以及其他属性的进程. Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. Thread(target=None, name=None,…
  一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 二 开启线程的两种方式 #方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print('%…
大家好,并发编程 进入第三篇. 上班第一天,大家应该比较忙吧.小明也是呢,所以今天的内容也很少.只要几分钟就能学完. 昨天我们说,线程与线程之间要通过消息通信来控制程序的执行. 讲完了消息通信,今天就来探讨下线程里的信息隔离是如何做到的. 大家注意:信息隔离,这并不是官方命名的名词,也不是网上广为流传的名词.是我为了方便理解而自创的,大家知道就好咯. 本文目录 初步认识信息隔离 信息隔离的意义何在 . 初步认识信息隔离 什么是信息隔离?比如说,咱有两个线程,线程A里的变量,和线程B里的变量值不能…
一:进程间数据交换方法 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法: Queue,Pipe ,managers 1)Queue,使用方法跟threading里的queue差不多 # -*- coding:utf-8 -*- __author__ = 'shisanjun' from multiprocessing import Process,Queue import threading import queue # def run(q): # q.put([42,N…
1.基本概念 多进程库提供了Pool类来实现简单的多进程任务.Pool类有以下方法: - apply():直到得到结果之前一直阻塞. - apply_async():这是apply()方法的一个变体,返回的是一个result对象.这是一个异步的操作,在所有的子类执行之前不会锁住主进程. - map():这是内置的map函数的并行版本,在得到结果之前一直阻塞,此方法将可迭代的数据的每一个元素作为进程池的一个任务来执行. - map_async():这是map的一个变体,返回一个result对象.如…