python进程间通信

1 python提供了多种进程通信的方式,主要Queue和Pipe这两种方式,Queue用于多个进程间实现通信,Pipe是两个进程的通信

1.1 Queue有两个方法:

  • Put方法:以插入数据到队列中,他还有两个可选参数:blocked和timeout。详情自行百度

  • Get方法:从队列读取并且删除一个元素。同样,他还有两个可选参数:blocked和timeout。详情自行百度

#!coding:utf-8
from multiprocessing import Process, Queue
import os,time,random #写数据进程执行的代码
def proc_write(q,urls):
print 'Process is write....'
for url in urls:
q.put(url)
print 'put %s to queue... ' %url
time.sleep(random.random()) #读数据进程的代码
def proc_read(q):
print('Process is reading...')
while True:
url = q.get(True)
print('Get %s from queue' %url) if __name__ == '__main__':
#父进程创建Queue,并传给各个子进程
q = Queue()
proc_write1 = Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
proc_write2 = Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
proc_reader = Process(target=proc_read,args=(q,))
#启动子进程,写入
proc_write1.start()
proc_write2.start() proc_reader.start()
#等待proc_write1结束
proc_write1.join()
proc_write2.join()
#proc_raader进程是死循环,强制结束
proc_reader.terminate()
  • 运行截图:

1.2 Pipe通信机制,

* Pipe常用于两个进程,两个进程分别位于管道的两端

* Pipe方法返回(conn1,conn2)代表一个管道的两个端,Pipe方法有duplex参数,默认为True,即全双工模式,若为FALSE,conn1只负责接收信息,conn2负责发送,

* send和recv方法分别为发送和接收信息。

#!coding:utf-8
import multiprocessing
import os,time,random #写数据进程执行的代码
def proc_send(pipe,urls):
#print 'Process is write....'
for url in urls: print 'Process is send :%s' %url
pipe.send(url)
time.sleep(random.random()) #读数据进程的代码
def proc_recv(pipe):
while True:
print('Process rev:%s' %pipe.recv())
time.sleep(random.random()) if __name__ == '__main__':
#父进程创建pipe,并传给各个子进程
pipe = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10) ]))
p2 = multiprocessing.Process(target=proc_recv,args=(pipe[1],))
#启动子进程,写入
p1.start()
p2.start() p1.join()
p2.terminate()
  • 运行结果;

最新文章

  1. wampsever在线模式和离线模式有什么区别
  2. phpMyAdmin上传文件大小限制
  3. CCLabelAtlas
  4. Qt 第一步,环境搭建与测试
  5. 使用iScroll和photoswipe写手机浏览图片的插件的几点经验
  6. (转)mysql 的 find_in_set函数使用方法
  7. poj2255 (二叉树遍历)
  8. Ghost源代码
  9. 基础算法-查找:线性索引查找(II)
  10. Objective-C基调(4)Category
  11. zookeeper详解
  12. hibernate多表查询封装实体
  13. Spring boot加载REACTIVE源码分析
  14. 【转载】vi/vim使用进阶: 指随意动,移动如飞 (一)
  15. 安卓工作室 android studio 的 汉化 美化 定制 Android studio's Chinesization beautification customization
  16. Vuex状态管理详解
  17. discern concern fifth sixth
  18. cmake-cmake.1-3.11.4机翻
  19. Highcharts.js -纯javasctipt图表库初体验
  20. 20165332 2017-2018-2《Java程序设计》课程总结

热门文章

  1. ubuntu 更新国内源
  2. <每日一题>题目10:求斐波拉契数列
  3. Jqgrid 序号列宽度调整
  4. 查找父进程,进程的PEB 进程是否被调试 NtQueryInformationProcess
  5. [转]WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组
  6. NOIP2017普及组初赛总结
  7. Python之MySQL语法(增删改查)
  8. exit()和return语句的区别
  9. HTML5 drag拖动事件
  10. 【DM8168学习笔记2】DM8168 EZSDK 结构