进程与线程的通信机制----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; ...
随机推荐
- Joda-Time开源库
Joda-Time是一个面向 Java™ 平台的易于使用的开源时间日期库. 依赖 <dependency> <groupId>joda-time</groupId> ...
- 第13章 切换到混合流并添加API访问 - Identity Server 4 中文文档(v1.0.0)
在之前的快速入门中,我们探讨了API访问和用户身份验证.现在我们想把这两个部分放在一起. OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来 ...
- [心得] 如何利用liquibase進行資料庫版本控制 - 實際練習
透過上一篇的基本觀念介紹,希望大家應該有一點點感覺了! 這篇我們就來做個簡單的版本演練,加深印象吧! 我使用的環境如下 System : Windows 7 Database : SQL Server ...
- [Go] golang的select多路选择功能
基于select的多路复用:1.解决如果一个channel中没有事件发过来,程序会立即阻塞,无法接收到第二个channel中的事件2.一般每一个case都代表一个通信操作,多个case会选一个能执行的 ...
- Easyui datagrid 扩展单元格textarea editor
datagrid 扩展单元格textarea editor by:授客 QQ:1033553122 测试环境 jquery-easyui-1.5.3 问题描述 如下,在没有扩展的情况下,初始化如下 手 ...
- python模块--zipfile文件压缩
zipfile模块是python中一个处理压缩文件的模块,解决了不少我们平常需要处理压缩文件的需求 ,本文主要谈谈zipfile几个常用的用法. 首先我在Windows操作系统中创建如下的文件目录: ...
- Prometheus Operator - 每天5分钟玩转 Docker 容器技术(177)
前面我们介绍了 Kubernetes 的两种监控方案 Weave Scope 和 Heapster,它们主要的监控对象是 Node 和 Pod.这些数据对 Kubernetes 运维人员是必须的,但还 ...
- Greenplum扩容
Greenplum支持原有主机扩展Segment个数.新增主机.和混合扩展 本文以在已有机器上扩展节点为例 1.可按照hostname:address:port:fselocation:dbid:co ...
- local_irq_disable和disable_irq的区别
local_irq_disable: local_irq_disable的功能是屏蔽当前CPU上的所有中断,通过操作arm核心中的寄存器来屏蔽到达CPU上的中断,此时中断控制器中所有送往该CPU上的中 ...
- c/c++ linux 进程间通信系列7,使用pthread mutex
linux 进程间通信系列7,使用pthread mutex #include <stdio.h> #include <stdlib.h> #include <unist ...