Python通过4种方式实现进程数据通信


Posted in Python onMarch 12, 2020

python提供了4种方式来满足进程间的数据通信

1. 使用multiprocessing.Queue可以在进程间通信,但不能在Pool池创建的进程间进行通信

2. 使用multiprocessing.Manager.Queue可以在Pool进程池创建的进程间进行通信

3. 通过Pipe进行线程间的通信, pipe进程间通信的性能高于Queue,但是它只能在两个进程间进行通信

4. 使用Manager类提供的数据结构可以进行进程间的通信

from multiprocessing import Process, Queue, Pool, Manager, Pipe
# 注意线程间的通信,使用的queue.Queue
# from queue import Queue
import time


# 1. 使用multiprocessing.Queue可以在进程间通信

# def producer(queue):
#   queue.put('A')
#   time.sleep(2)
#
# def consumer(queue):
#   time.sleep(2)
#   data = queue.get()
#   print(data)
#
# if __name__ == '__main__':
#   queue= Queue(10)
#   p = Process(target=producer, args=(queue,))
#   c = Process(target=consumer, args=(queue,))
#   p.start()
#   c.start()
#   p.join()
#   c.join()


# 2. 使用共享全局变量,在多进程间通信(结论: 不行)
# def producer(a):
#   a += 1
#   time.sleep(2)
#
#
# def consumer(a):
#   time.sleep(2)
#   print(a)
#
# if __name__ == '__main__':
#   a = 1
#   p = Process(target=producer, args=(a,))
#   c = Process(target=consumer, args=(a,))
#   p.start()
#   c.start()
#   p.join()
#   c.join()


# 3. multiprocessing.Queue不能用于multiprocessing.Pool进程池创建的进程间进行通信
# def producer(queue):
#   queue.put('A')
#   time.sleep(2)
#
#
# def consumer(queue):
#   time.sleep(2)
#   data = queue.get()
#   print("consumer:%s" % data)
#
#
# if __name__ == '__main__':
#   # queue = Queue(10) # 这个是使用multiprocessing.Queue,无效
#   queue = Manager().Queue(10) # 这个是使用multiprocessing.Manager.Queue, 可以
#   pool = Pool(2)
#   pool.apply_async(producer, args=(queue,))
#   pool.apply_async(consumer, args=(queue,))
#   pool.close()
#   pool.join()


# 4.通过Pipe进行线程间的通信, pipe进程间通信的性能高于Queue
# def producer(pipe):
#   pipe.send('admin')
#
#
# def consumer(pipe):
#   data = pipe.recv()
#   print("consumer:%s" % data)
#
#
# if __name__ == '__main__':
#   receive_pipe, send_pipe = Pipe()
#   """Pipe只能适应于两个进程间的通信"""
#   p = Process(target=producer, args=(send_pipe,))
#   c = Process(target=consumer, args=(receive_pipe,))
#   p.start()
#   c.start()
#   p.join()
#   c.join()


# 5. 进程间通信的其它方式

def add_data(p_dict, key, value):
  p_dict[key] = value

if __name__ == '__main__':
  progress_dict = Manager().dict() #Manager()类中提供的数据结构都能够做到进程的通信
  first_progress = Process(target=add_data, args=(progress_dict, 'name', 'admin',))
  second_progress = Process(target=add_data, args=(progress_dict, 'age', 45,))
  first_progress.start()
  second_progress.start()
  first_progress.join()
  second_progress.join()
  print(progress_dict) #{'age': 45, 'name': 'admin'}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中定义结构体的方法
Mar 04 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
python获取交互式ssh shell的方法
Feb 14 Python
详解Python的三种可变参数
May 08 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
详解python中__name__的意义以及作用
Aug 07 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
python通过函数名调用函数的几种场景
Sep 23 Python
Python多进程编程multiprocessing代码实例
Mar 12 #Python
Python多线程多进程实例对比解析
Mar 12 #Python
Python线程协作threading.Condition实现过程解析
Mar 12 #Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 #Python
Python基于read(size)方法读取超大文件
Mar 12 #Python
Python函数生成器原理及使用详解
Mar 12 #Python
python deque模块简单使用代码实例
Mar 12 #Python
You might like
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
Python 闭包的使用方法
2017/09/07 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
python随机数分布random均匀分布实例
2019/11/27 Python
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
大学生个人简历自我评价
2013/11/16 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
设计专业自荐信
2014/06/19 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
处级干部考察材料
2014/12/24 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
活动经费申请报告
2015/05/15 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python