当然,这三种办法都会在两个进程之间把数据复制一遍,效率肯定没有 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. 【Python】一键提取inp文件结构的脚本

    inp=input("输入文件路径:") # print(type(inp)) ex_txt=inp+'-Struct.inp' inp=inp+'.inp' import re ...

  2. AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现

    引言 在当今这个数据爆炸的时代,信息的快速存储与高效检索已经成为技术领域的核心挑战.随着人工智能(AI)和机器学习(ML)的迅猛发展,向量存储和相似性搜索技术逐渐崭露头角,成为处理海量数据的利器.对于 ...

  3. Web前端入门第 13 问:HTML 标签和属性是否区分大小写?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 注意:以下截图都来源于 Chrome 浏览器,不同浏览器可能会产生不同的渲染结果. 思考一个问题:英文写法都分大 ...

  4. Golang 入门 : 符文

    字符串常用语表示一系列文本字符,而Go的符文(rune)则用于表示单个字符. 字符串字面量由双引号(")包围,但rune字面量由单引号(')包围. Go程序几乎可以使用地球上任何语言的任何字 ...

  5. php7有哪些新特性

    目录 太空船操作符 标量类型声明和返回值的类型说明 null 合并操作符 常量数组 namespace 批量导入 非混合模式的 use 声明 混合模式的 use 声明 复合模式的 use 声明 thr ...

  6. 通过 openpyxl 操作 excel 表格

    博客地址:https://www.cnblogs.com/zylyehuo/ STEP1: 导入相关库 import os from openpyxl import load_workbook STE ...

  7. CentOS7安装图形界面模式

    0.9272019.03.24 15:17:05字数 865阅读 22,115 本人通过VMware14安装Centos7.6过程中出现蓝屏现象,最后发现是因为在系统安装图形界面过程中报错导致,所以决 ...

  8. 从上下文切换谈thread_local工作原理

    从上下文切换谈thread_local工作原理 thread_local是什么 熟悉多线程编程的小伙伴一定对thread_local不陌生,thread_local 是 C++11 引入的一种存储类说 ...

  9. Linux基本开发环境配置git,c++,nodejs,nginx

    Linux基本开发环境配置 前一篇文章配置了基本的SSH,本文来讲讲关于基本的开发环境的配置,包括git,c,c++,nodejs,nginx. 安装git和配置无密码登录github yum ins ...

  10. Lua虚拟机

    Lua虚拟机概述 何为"虚拟机"? 在一门脚本语言中,总会有一个虚拟机,可是"虚拟机"是什么?简而言之,这里的"虚拟机"就是使用代码实现的用 ...