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

  进程:

  1. from multiprocessing import Process
  2. from threading import Thread
  3. def get(lis):
  4. while len(lis) != 0: # 注意一定要加上判定条件,不然进程不会退出的。
  5. s = lis.pop()
  6. print('get %s', s)
  7.  
  8. if __name__ == '__main__':
  9. lis = list(range(1, 11))
  10. process1 = Process(target=get, args=(lis,))
  11. process2 = Process(target=get, args=(lis,))
  12. process1.start()
  13. process2.start()
  14. process1.join()
  15.  
  16. get %s 10
  17. get %s 10
  18. get %s 9
  19. get %s 9
  20. get %s 8
  21. get %s 8
  22. get %s 7
  23. get %s 7
  24. get %s 6
  25. get %s 6
  26. get %s 5
  27. get %s 4
  28. get %s 5
  29. get %s 3
  30. get %s 4
  31. get %s 2
  32. get %s 3
  33. get %s 1
  34. get %s 2
  35. get %s 1

  线程:

  1. from multiprocessing import Process
  2. from threading import Thread
  3. def get(lis):
  4. while len(lis) !=0: # 注意一定要加判定条件,不然线程不会会一直等待,不会退出的。
  5. s = lis.pop()
  6. print('get %s', s)
  7.  
  8. if __name__ == '__main__':
  9. lis = list(range(1, 11))
  10. thread1 = Thread(target=get, args=(lis,))
  11. thread2 = Thread(target=get, args=(lis,))
  12. thread1.start()
  13. thread2.start()
  14. thread1.join()
  15. thread2.join()
  16. print('finished')
  17.  
  18. get %s 10
  19. get %s 9
  20. get %s 8
  21. get %s 7
  22. get %s 6
  23. get %s 5
  24. get %s 4
  25. get %s 3
  26. get %s 2
  27. get %s 1
  28. 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(),不然进程或者线程会一直等待。

  1. from multiprocessing import Process, Pipe
  2.  
  3. def producer(queue):
  4. queue.send('bobby')
  5.  
  6. def comsumer(queue):
  7. print(queue.recv())
  8.  
  9. if __name__ == '__main__':
  10. recv_pipe, send_pipe = Pipe() 注意创建时候必须同时创建两个对象一个用于发送一个用于取出。
  11. my_producer = Process(target=producer, args=(send_pipe,))
  12. my_comsumer = Process(target=comsumer, args=(recv_pipe,))
  13. my_producer.start()
  14. my_comsumer.start()
  15. my_producer.join()
  16. my_comsumer.join()
  17.  
  18. 输出:
  19. 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. Java8之Optional类

    写在前头 今天再看阿里的Java开发手册,里面异常处理第10条提到这样一个建议. [推荐]防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景:1 ) 返回类型为基本数据类型,return 包 ...

  2. WPF 窗口大小自适应

    在设置桌面不同分辨率以及较大DPI下,窗口如何显示的问题. 方案一 设置窗口最大值和最小值显示 通过对比当前屏幕的可显示区域,将窗口高宽最大值和最小值,设置为窗口的实际高宽(此例中仅设置高度) 界面设 ...

  3. PostGIS计算矢量切片(一)--渲染数据

        没写错,是使用postgis计算出来矢量切片.在这之前先准备一个数据:一个GIS数据表(本例中数据为一百万的点数据,坐标:4326),并在表中添加x,y字段,方便后面的数据筛选.sql中用到了 ...

  4. docker 学习资料收集

    Docker中文网 http://www.docker.org.cn/book/ docker镜像怎么迁移到其他的服务器 http://www.talkwithtrend.com/Question/1 ...

  5. Android为TV端助力 UDP协议

    废话不多说.直接上代码! 一. 接收端 1.创建UDP连接 public void init() { try { //开关的作用 isRunning = true; DatagramSocket mU ...

  6. C# 类如何声明索引器以提供对类的类似数组的访问的代码

    研发期间,将内容过程中比较常用的内容段做个收藏,如下内容内容是关于 C# 类如何声明索引器以提供对类的类似数组的访问.的内容,希望能对各位有用处. using System;using System. ...

  7. Android人脸识别App(带web上传注册信息)

    人脸识别+本机Web后端人脸sdk采用虹软sdk,本机web采用AndServer:上传姓名+人脸图片即可实现注册源码地址:https://github.com/joetang1989/ArcFace ...

  8. <5>Python的uwsgi web服务器

    一.是什么? uWSGI是web服务器,用来部署线上web应用到生产环境.uWSGI实现了WSGI协议.uwsgi协议.http协议.WSGI(Web Server Gateway Interface ...

  9. 理解ECS的概念和Unity中的ECS设计

    组合优于继承 ecs的概念很早就有了,最初的主要目的应该还是为了改善设计. e-c-s三者都有其意义,e-c是组合优于继承,主要用以改善oo的继承耦合过重以及多继承菱形问题. oop常见设计里,每个g ...

  10. macos 远程 windows 10

    使用的工具:Parallels Client 免费,可以从windows store 免费下载: 只有这个最好用,希望能帮到你.和原生的windows 远程桌面功能很像: