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分析apache访问日志脚本分享
Feb 26 Python
Python编程中的for循环语句学习教程
Oct 14 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
tensorflow2.0保存和恢复模型3种方法
Feb 03 Python
基于python 取余问题(%)详解
Jun 03 Python
基于python实现坦克大战游戏
Oct 27 Python
Python之字符串的遍历的4种方式
Dec 08 Python
Python编解码问题及文本文件处理方法详解
Jun 20 Python
关于python爬虫应用urllib库作用分析
Sep 04 Python
python如何查找列表中元素的位置
May 30 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
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
jqTransform美化表单
2015/10/10 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
如何通过jdbc调用存储过程
2012/04/19 面试题
学生个人求职自荐信格式
2013/09/23 职场文书
珍珠奶茶店创业计划书
2014/01/11 职场文书
平安工地建设方案
2014/05/06 职场文书
大班亲子运动会方案
2014/06/10 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
检讨书格式
2019/04/25 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书