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实现定时播放mp3
Mar 29 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
儿童python练习实例
May 27 Python
python实现接口并发测试脚本
Jun 25 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
Python爬虫制作翻译程序的示例代码
Feb 22 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模板页面中分页代码的解析
2009/02/06 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
Python内置数据类型详解
2014/08/18 Python
Python中对列表排序实例
2015/01/04 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
使用pandas读取文件的实现
2019/07/31 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
成教毕业生自我鉴定
2013/10/23 职场文书
个人自我鉴定
2013/11/07 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
英语辞职信范文
2015/02/28 职场文书
公司更名通知函
2015/04/24 职场文书
地心历险记观后感
2015/06/15 职场文书
运动员加油词
2015/07/18 职场文书
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python
Oracle中DBLink的详细介绍
2022/04/29 Oracle