当然,这三种办法都会在两个进程之间把数据复制一遍,效率肯定没有 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. C/C++ 创建Socket实现双工通信

    点击查看代码 实现简单的Socket通信 服务端代码(Server) #include <stdio.h> #include <winsock2.h> #pragma comm ...

  2. Kubernetes 编译 kubeadm 修改证书有效期到 100 年

    前言 kubeadm 生成的客户端证书在 1 年后到期.过期后,会导致服务不可用,使用过程中会出现:x509: certificate has expired or is not yet valid. ...

  3. 链表的创建&遍历打印

    博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Node: def __init__(self, item): ...

  4. 【Python】【魔术方法】(一)构造和初始化

    本篇讲解的魔术方法: __new__ __init__ __del__ __repr__ __format__ __bytes__ 1. __new__ 在Python中,__new__ 方法是一个特 ...

  5. 【Git】Git GUI的使用

    在Git命令行一文中已经对Git的操作命令进行了简单的介绍,但是理论知识过于枯燥,使得初学者在Git的使用上还是会有很大的困难.虽然我更推荐使用Git Bash方式对Git进行操作,但是对于大部分只是 ...

  6. 【SpringCloud】Ribbon负载均衡调用

    Ribbon负载均衡调用 概述 是什么 Spring Cloud Ribbon是基于Netlix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目, ...

  7. 创建windows脚本bat/cmd或jar为windows服务完整教程

    ​ 一.将windows bat/cmd脚本创建为windows服务 1.下载winsw工具 https://gitee.com/colinisg/winsw/releases/download/v2 ...

  8. [T.4] 团队项目:团队代码管理准备

    团队的代码仓库地址 [GitHub - Meng-XuanYu/JayJay-TeamVersionControl: A public repo for BUAASE2025 course homew ...

  9. AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析

    AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析 阅读时间: 5分钟 | 字数: 1500+ "你是否曾为单个大模型难以解决复杂专业问题而苦恼?是否想过,如果能像组建专业团队 ...

  10. Linux shutdown 命令

    Linux shutdown 命令可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机. 使用权限:系统管理者. 语法 shutdown [-t ...