python多进程实现进程间通信实例


Posted in Python onNovember 24, 2017

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

multiprocessing.Queue()

以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

multiprcessing.Queue.put() 为 入队操作

multiprcessing.Queue.get() 为 出队操作

队列 线程 和 进程 安全

put(obj[, block[, timeout]])

将obj放入队列。 如果可选参数 block为True(默认值),timeout为None(默认值),则必要时阻止,直到空闲插槽可用。 如果超时是正数,它将阻止最多超时秒数,如果在该时间内没有空闲插槽可用,则会引发Queue.Full异常。 否则(块为False),如果空闲插槽立即可用,则将一个项目放在队列中,否则会引发Queue.Full异常(在这种情况下,忽略超时)。

get([block[, timeout]])

从队列中删除并返回一个项目。 如果可选的args块为True(默认值),超时为None(默认值),则在必要时阻止,直到项目可用。 如果超时为正数,则它将阻塞至多超时秒数,并在该时间内没有可用项目时引发Queue.Empty异常。 否则(block为False),如果一个项目立即可用,返回一个项目,否则会引发Queue.Empty异常(在这种情况下,忽略超时)。

#- * -coding: utf - 8 - * -
  from multiprocessing
import Process, Queue
import os
import time
import random


# 写数据进程执行的代码:
  def write(q):
  print('Process to write: %s' % os.getpid())
for value in ['A', 'B', 'C']:
  print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())

# 读数据进程执行的代码:
  def read(q):
  print('Process to read: %s' % os.getpid())
while True:
  value = q.get()
print('Get %s from queue.' % value)

if __name__ == '__main__': #父进程创建Queue, 并传给各个子进程:
q = Queue()
pw = Process(target = write, args = (q, ))
pr = Process(target = read, args = (q, ))# 启动子进程pw, 写入:
  pw.start()# 启动子进程pr, 读取:
  pr.start()# 等待pw结束:
  pw.join()# pr进程里是死循环, 无法等待其结束, 只能强行终止:
  pr.terminate()

输出

Process to read: 5836
Process to write: 6472
Put A to queue...
Put B to queue...
Get A from queue.
Put C to queue...
Get B from queue.
Get C from queue.

Process finished with exit code 0

multiprocessing.Pipe()

Pipe()函数返回一对由管道连接的连接对象,默认情况下是双工(双向)。

Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏。 当然,同时使用管道不同端的过程也不会有风险。

返回表示管道末端的一对Connection(conn1,conn2)对象。

如果duplex为True(默认),则管道是双向的。

如果duplex是False,那么管道是单向的:conn1只能用于接收消息,conn2只能用于发送消息。

#- * -coding: utf - 8 - * -
  from multiprocessing
import Process, Pipe

def f(conn):
  conn.send([42, None, 'hello'])
while True:
  print(conn.recv())

if __name__ == '__main__':
  parent_conn, child_conn = Pipe()
p = Process(target = f, args = (child_conn, ))
p.start()
print parent_conn.recv()# prints "[42, None, 'hello']"
parent_conn.send('666')
p.terminate()

输出:

[42, None, 'hello']
666

Process finished with exit code 0

总结

以上就是本文关于python多进程实现进程间通信实例的全部内容,希望对大家有所帮助。感兴趣的朋友可继续参阅本站:

如有不足之处,欢迎留言指出。

Python 相关文章推荐
Python中使用语句导入模块或包的机制研究
Mar 30 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
Python 互换字典的键值对实例
Feb 12 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
Django 批量插入数据的实现方法
Jan 12 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 Python
python创建字典及相关管理操作
Apr 13 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 #Python
Python二叉树的定义及常用遍历算法分析
Nov 24 #Python
详解python上传文件和字符到PHP服务器
Nov 24 #Python
Python实现矩阵转置的方法分析
Nov 24 #Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 #Python
利用python3随机生成中文字符的实现方法
Nov 24 #Python
Python内置函数 next的具体使用方法
Nov 24 #Python
You might like
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
Python字符串三种格式化输出
2020/09/17 Python
几款好用的python工具库(小结)
2020/10/20 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
《火烧云》教学反思
2014/04/12 职场文书
珍惜资源的建议书
2014/08/26 职场文书
2015年财务部工作总结
2015/04/10 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
小学生教师节广播稿
2015/08/19 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
小学四年级作文之写景
2019/08/23 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书