进程与线程的通信机制----Queue
进程运行时候变量是隔离的,线程间共享全局变量。
进程:
from multiprocessing import Process
from threading import Thread
def get(lis):
while len(lis) != 0: # 注意一定要加上判定条件,不然进程不会退出的。
s = lis.pop()
print('get %s', s) if __name__ == '__main__':
lis = list(range(1, 11))
process1 = Process(target=get, args=(lis,))
process2 = Process(target=get, args=(lis,))
process1.start()
process2.start()
process1.join() get %s 10
get %s 10
get %s 9
get %s 9
get %s 8
get %s 8
get %s 7
get %s 7
get %s 6
get %s 6
get %s 5
get %s 4
get %s 5
get %s 3
get %s 4
get %s 2
get %s 3
get %s 1
get %s 2
get %s 1
线程:
from multiprocessing import Process
from threading import Thread
def get(lis):
while len(lis) !=0: # 注意一定要加判定条件,不然线程不会会一直等待,不会退出的。
s = lis.pop()
print('get %s', s) if __name__ == '__main__':
lis = list(range(1, 11))
thread1 = Thread(target=get, args=(lis,))
thread2 = Thread(target=get, args=(lis,))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print('finished') get %s 10
get %s 9
get %s 8
get %s 7
get %s 6
get %s 5
get %s 4
get %s 3
get %s 2
get %s 1
finished
进程与线程的Queue
- 线程用的消息队列
from queue import Queue
- 进程用的消息队列
from multiprocessing import Queue
- 进程池用的消息队列(不能用from multiprocessing import Queue)
from multiprocessing import Manager
queue = Manager().Queue()
- 特殊的,只用于两个进程间的通信Pipe(性能高于Queue,如果只有两个进程推荐使用)
from multiprocessing import Pipe
- 其它进程间的共享内存操作,列表、字典或其它python对象。
from multiprocessing import manager
manager = manager()
my_list = manager.list() / my_dict = manager.dict()/
在使用Queue的时候,如果使用的默认的get后者put方法,(即(block=True, timeout=None))不管是多线程,还是多进程,在从队列中取出url的时候一定要加上判定条件,while queue.qsize()!=0 或者 while not queue.empty(),不然进程或者线程会一直等待。
from multiprocessing import Process, Pipe def producer(queue):
queue.send('bobby') def comsumer(queue):
print(queue.recv()) if __name__ == '__main__':
recv_pipe, send_pipe = Pipe() 注意创建时候必须同时创建两个对象一个用于发送一个用于取出。
my_producer = Process(target=producer, args=(send_pipe,))
my_comsumer = Process(target=comsumer, args=(recv_pipe,))
my_producer.start()
my_comsumer.start()
my_producer.join()
my_comsumer.join() 输出:
bobby
进程与线程的通信机制----Queue的更多相关文章
- Android线程间通信机制——深入理解 Looper、Handler、Message
在Android中,经常使用Handler来实现线程间通信,必然要理解Looper , Handler , Message和MessageQueue的使用和原理,下面说一下Looper , Handl ...
- Python并发编程之线程消息通信机制任务协调(四)
大家好,并发编程 进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 . 前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程 ...
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- 三种进程和线程数据共享模块方法Queue》Pipe》manager
>>>>线程中的queue import threading import queue def f(qq): print("in child",qq.qsi ...
- 线程间通信:Queue
线程间使用队列来互相交换数据,数据可以是字符串 .列表 .元组等,Queue 是提供队列操作的模块,常见的队列如下: FIFO:First In First Out 先进先出队列,也就是最先放进去的数 ...
- JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制
本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...
- Android 进程和线程模型
Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了. 在 Li ...
- Android线程间异步通信机制源码分析
本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...
- Java——线程间通信
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
随机推荐
- c#中的Unity容器
DIP是依赖倒置原则:一种软件架构设计的原则(抽象概念).依赖于抽象不依赖于细节 IOC即为控制反转(Inversion of Control):传统开发,上端依赖(调用/指定)下端对象,会有依赖,把 ...
- EF 的 CURD 操作
EF 的 CURD 操作 这里采用了数据库 Northwind,下载地址:https://northwinddatabase.codeplex.com/ 增 /// <summary> / ...
- Maven(十一)导入手动创建的Maven 工程
传统的导入方式并不能导入手动创建的Maven工程 因为eclipse项目必须有如图所示文件,才被认为是Eclipse工程 使用Maven方式导入 导入选项中并没有把项目复制到工作空间的选项,这是与传统 ...
- java开发环境配置——IDEA SVN的使用
一.安装svn客户端,在idea中配置svn 装小乌龟,TortoiseSVN ,就下图一个要注意的地方,这里默认 command line client tools是不安装的,选上.如果已经安装过了 ...
- Ext中继承知识点
Ext.define(entend):定义类,单继承 Ext.define(override):定义类的补丁(扩展或重写) Ext.extend:老版本的定义类,单继承 Ext.override:4种 ...
- html初步学习
①:<meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale ...
- python(day16)内置函数,匿名函数
# add = lambda x,y:x+y # print(add(1,2)) # dic={'k1':10,'k2':100,'k3':30} # def func(key): # return ...
- ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
一.前言 1.本文主要内容 ASP.NET Core MVC路由工作原理概述 ASP.NET Core MVC带路径参数的路由示例 ASP.NET Core MVC固定前/后缀的路由示例 ASP.NE ...
- FT 软件项目管理
FT 软件项目: 以Feature Team形式组织起来的软件研发项目. 项目是临时组织不是长期组织. 人员临时组织起来, 无组织汇报关系.大家需要充分理解和认同项目的目标,通过项目获得技术.经验. ...
- Linux中 SonarQube代码质量管理平台以及C++插件安装
SonarQube是管理代码质量一个开源平台,可以快速的定位代码中潜在的或者明显的错误. SonarQube安装 1.环境准备 (1)sonarQube 下载地址https://www.sonarqu ...