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中的各种函数的使用
May 24 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
使用python为mysql实现restful接口
Jan 05 Python
浅析Python3爬虫登录模拟
Feb 07 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
centos7中安装python3.6.4的教程
Dec 11 Python
Python的历史与优缺点整理
May 26 Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
Python实现简单的猜单词
Jun 15 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
很好用的PHP数据库类
2009/05/27 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
深入分析js的冒泡事件
2014/12/05 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python格式化日期时间操作示例
2018/06/28 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
大二自我鉴定
2014/01/31 职场文书
银行服务感言
2014/03/01 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
先进工作者个人总结
2015/02/15 职场文书
离婚案件上诉状
2015/05/23 职场文书
酒店宣传语大全
2015/07/13 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
MySQL中in和exists区别详解
2021/06/03 MySQL