进程运行时候变量是隔离的,线程间共享全局变量。

  进程:

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的更多相关文章

  1. Android线程间通信机制——深入理解 Looper、Handler、Message

    在Android中,经常使用Handler来实现线程间通信,必然要理解Looper , Handler , Message和MessageQueue的使用和原理,下面说一下Looper , Handl ...

  2. Python并发编程之线程消息通信机制任务协调(四)

    大家好,并发编程 进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 . 前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程 ...

  3. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  4. 三种进程和线程数据共享模块方法Queue》Pipe》manager

    >>>>线程中的queue import threading import queue def f(qq): print("in child",qq.qsi ...

  5. 线程间通信:Queue

    线程间使用队列来互相交换数据,数据可以是字符串 .列表 .元组等,Queue 是提供队列操作的模块,常见的队列如下: FIFO:First In First Out 先进先出队列,也就是最先放进去的数 ...

  6. JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制

    本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...

  7. Android 进程和线程模型

    Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了. 在 Li ...

  8. Android线程间异步通信机制源码分析

    本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...

  9. Java——线程间通信

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

随机推荐

  1. 【原创】PicUploader: 一个还不错的图床工具

    PicUploader PicUploader 是一个用php编写的图床工具,它能帮助你快速上传你的图片到云图床,并自动返回Markdown格式链接到剪贴板.配置完成后,要获取一个可用于markdow ...

  2. 程序员如何描述清楚线上bug

    案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...

  3. Mac下如何用SSH连接远程Linux服务器

     终端命令 a).打开Mac的命令终端 b).输入ssh -p 22 root@102.210.86.213 它会提示你输入密码,输入正确的密码之后,你就发现已经登陆成功了.(22: 端口号 root ...

  4. Vim设置Tab宽度/替换Tab为空格

    用户配置: 在/home/you/.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:set ts=4  (注:ts是tabstop的缩写,设TAB宽4个空格)set expandt ...

  5. Activiti(二) springBoot2集成activiti,集成activiti在线设计器

    摘要 本篇随笔主要记录springBoot2集成activiti流程引擎,并且嵌入activiti的在线设计器,可以通过浏览器直接编辑出我们需要的流程,不需要通过eclipse或者IDEA的actiB ...

  6. 仿9GAG制作过程(四)

    有话要说: 这次主要讲述主页面下拉刷新和上拉加载功能的实现. 主要是使用了SwipeRefreshLayout的布局方式,并在此基础上通过RecyclerView的特性增加了上拉加载的功能. 成果: ...

  7. Docker 创建 Confluence6.12.2 中文版

    目录 目录 1.介绍 1.1.什么是Confluence? 2.Confluence的官网在哪里? 3.如何下载安装? 4.对 Confluence 进行配置 4.1.设置 Confluence 4. ...

  8. 【原】Java学习笔记017 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 继承关系中的pri ...

  9. CFS调度器(1)-基本原理

    首先需要思考的问题是:什么是调度器(scheduler)?调度器的作用是什么?调度器是一个操作系统的核心部分.可以比作是CPU时间的管理员.调度器主要负责选择某些就绪的进程来执行.不同的调度器根据不同 ...

  10. Swift NSAttributedString的使用

    NSMutableAttributedString let testAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue, ...