当然,这三种办法都会在两个进程之间把数据复制一遍,效率肯定没有 shared memory 高,但是考虑到这三种方式都不用考虑锁之类东西,用起来是比较方便的。这三种方式的实现的功能都是差不多的,但是在不同的情境下它们各自的性能怎么样呢?

下面给出测试的代码,逻辑都是差不多的。本次的测试数据是一个长度为size大小的纯int列表

这里测试两组数据,一组是“少量多次”size=5,times=5000, 一组是“多量少次”size=8000,times=45

pipe 测试代码
from multiprocessing import Process, Queue, Pipe
import time, os
import random size = int(input("data size:"))
times = int(input("test times:")) test_data = [[random.randint(0,1000) for i in range(size)] for j in range(times)] def worker(que):
st = time.time()
for i in range(times):
que.recv()
print(f"time: {time.time() - st}") conn1, conn2 = Pipe()
# queue = Queue()
Process(target=worker, args=(conn2,)).start() for i in range(times):
conn1.send(test_data)
queue 测试代码
from multiprocessing import Process, Queue, Pipe
import time, os
import random size = int(input("data size:"))
times = int(input("test times:")) test_data = [[random.randint(0,1000) for i in range(size)] for j in range(times)] def worker(que:Queue):
st = time.time()
for i in range(times):
que.get()
print(f"time: {time.time() - st}") # conn1, conn2 = Pipe()
queue = Queue()
Process(target=worker, args=(queue,)).start() for i in range(times):
queue.put(test_data)
ZeroMQ 测试代码
from multiprocessing import Process, Queue, Pipe
import time, os
import zmq
import pickle
import random context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:5557") size = int(input("data size:"))
times = int(input("test times:")) test_data = [[random.randint(0,1000) for i in range(size)] for j in range(times)] def worker():
it = time.time() context = zmq.Context()
recive = context.socket(zmq.PULL)
recive.connect('tcp://127.0.0.1:5557') print(f"init time: {time.time() - it}") st = time.time()
for i in range(times):
pickle.loads(recive.recv())
print(f"time: {time.time() - st}") Process(target=worker).start() for i in range(times):
socket.send(pickle.dumps(test_data))

(ZeroMQ 这里额外说明一下,因为 ZeroMQ 不能直接传输列表,只能序列化后传输,为了模拟真实情境我就把序列化的时间也算进去了)

结果:

本来想列个表对比,现在看来差距不大,我还测了别的数据,感觉浮动比较大 (当然,这个实验是不严谨的)

python 多进程通讯三种方法性能对比(queue, pipe, zeromq)的更多相关文章

  1. python多进程(三种方法)

    #!/usr/bin/env python # -*- coding:utf- -*- from multiprocessing import Pool import time def f(x): t ...

  2. (六)C#中判断空字符串的三种方法性能分析

    三种方法分别是: string a=""; 1.if(a=="") 2.if(a==string.Empty) 3.if(a.Length==0) 三种方法是等 ...

  3. python—字符串拼接三种方法

    python—字符串拼接三种方法   1.使用加号(+)号进行拼接 字符串拼接直接进行相加就可以,比较容易理解,但是一定要记得,变量直接相加,不是变量就要用引号引起来,不然会出错,另外数字是要转换为字 ...

  4. 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法

    今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...

  5. python hello 的三种方法

    1)直接 print("hello") 2)使用main函数: def main(): print("Helloa你好") if __name__ == &qu ...

  6. python 多线程编程之threading模块(Thread类)创建线程的三种方法

    摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...

  7. python更新数据库脚本三种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...

  8. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  9. python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...

  10. python实现XML解析的三种方法

    python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...

随机推荐

  1. MyBatis与其使用方法讲解

    ORM 在讲解Mybatis之前,我们需了解一个概念ORM(Object-Relational Mapping)对象关系映射,其是数据库与Java对象进行映射的一个技术.通过使用ORM,我们可以不用编 ...

  2. Ubuntu 卸载安装nginx

    nginx很顽强,单独的删除它的文件是不够的,这会导致你再次安装时出现一系列的问题. 1.卸载nginx,及其配置文件 sudo apt-get --purge remove nginx 2.自动全部 ...

  3. 搭建自己的OCR服务,第一步:选择合适的开源OCR项目

    一.OCR是什么? 光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程. 亦即将图像中的文字进行识别 ...

  4. VTK-8.2.0源码编译和初步使用(Cmake+VS2015+Qt5.14.2)

    一.准备数据 1.首先确保已安装VS5015和Qt5.14.2 2.下载Cmake并安装:Download CMake 3.下载VTK-8.2.0源码和数据并解压:Download | VTK 二.C ...

  5. Oracle 修改SYS、system用户密码

      by:授客 QQ:1033553122 概念 SYS用户是Oracle中权限最高的用户,而SYSTEM是一个用于数据库管理的用户.在数据库安装完之后,应立即修改SYS,SYSTEM这两个用户的密码 ...

  6. 推荐8款 .NET 开源、免费、实用的 Windows 效率软件

    前言 今天大姚给大家推荐8款基于 .NET 开源.免费.实用的 Windows 效率软件,开发工作提升利器,希望可以帮助到有需要的小伙伴. DevToys DevToys是一个专门为开发者设计的Win ...

  7. JavaScript将时间戳转化为时间

    const timestampToTime= (timestamp) => { const date = new Date(timestamp * 1000); const year = dat ...

  8. JLabel展示文本和图片--java进阶day03

    1.JLabel 我们想要在窗体中展示图片或者文本是不能直接展示的,文本和图片必须要放在JLabel这个组件中 JLabel实质是窗体中的一块区域,创建了一个JLabel对象意味着在窗体中开辟了一块区 ...

  9. 【Maven】仓库

    在 Maven 的术语中,仓库是一个位置(place). Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库. 在 Maven 中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件 ...

  10. Readers and Writers JSON Framework(2)

    我们关心json的读写.特别在datasnap中,关于使用stream更是显得重要.其实轮子都帮你做好了,你不知道整经再研究就是一个悲哀.除非你要研究. 回正题: 处理json有二套框架. JSON ...