问题

你要通过网络连接发送和接受连续数据的大型数组,并尽量减少数据的复制操作。

解决方案

下面的函数利用 memoryviews 来发送和接受大数组:

# zerocopy.py

def send_from(arr, dest):

view = memoryview(arr).cast('B')

while len(view):

nsent = dest.send(view)

view = view[nsent:]

def recv_into(arr, source):

view = memoryview(arr).cast('B')

while len(view):

nrecv = source.recv_into(view)

view = view[nrecv:]

为了测试程序,首先创建一个通过socket连接的服务器和客户端程序:

>>> from socket import *

>>> s = socket(AF_INET, SOCK_STREAM)

>>> s.bind(('', 25000))

>>> s.listen(1)

>>> c,a = s.accept()

>>>

在客户端(另外一个解释器中):

>>> from socket import *

>>> c = socket(AF_INET, SOCK_STREAM)

>>> c.connect(('localhost', 25000))

>>>

本节的目标是你能通过连接传输一个超大数组。这种情况的话,可以通过 array 模块或 numpy 模块来创建数组:

# Server

>>> import numpy

>>> a = numpy.arange(0.0, 50000000.0)

>>> send_from(a, c)

>>>

# Client

>>> import numpy

>>> a = numpy.zeros(shape=50000000, dtype=float)

>>> a[0:10]

array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

>>> recv_into(a, c)

>>> a[0:10]

array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

>>>

讨论

在数据密集型分布式计算和平行计算程序中,自己写程序来实现发送/接受大量数据并不常见。 不过,要是你确实想这样做,你可能需要将你的数据转换成原始字节,以便给低层的网络函数使用。 你可能还需要将数据切割成多个块,因为大部分和网络相关的函数并不能一次性发送或接受超大数据块。

一种方法是使用某种机制序列化数据——可能将其转换成一个字节字符串。 不过,这样最终会创建数据的一个复制。 就算你只是零碎的做这些,你的代码最终还是会有大量的小型复制操作。

本节通过使用内存视图展示了一些魔法操作。 本质上,一个内存视图就是一个已存在数组的覆盖层。不仅仅是那样, 内存视图还能以不同的方式转换成不同类型来表现数据。 这个就是下面这个语句的目的:

view = memoryview(arr).cast('B')

它接受一个数组 arr并将其转换为一个无符号字节的内存视图。这个视图能被传递给socket相关函数, 比如 socket.send()或 send.recv_into()。 在内部,这些方法能够直接操作这个内存区域。例如,sock.send()直接从内存中发生数据而不需要复制。 send.recv_into()使用这个内存区域作为接受操作的输入缓冲区。

剩下的一个难点就是socket函数可能只操作部分数据。 通常来讲,我们得使用很多不同的 send()和 recv_into()来传输整个数组。 不用担心,每次操作后,视图会通过发送或接受字节数量被切割成新的视图。 新的视图同样也是内存覆盖层。因此,还是没有任何的复制操作。

这里有个问题就是接受者必须事先知道有多少数据要被发送, 以便它能预分配一个数组或者确保它能将接受的数据放入一个已经存在的数组中。 如果没办法知道的话,发送者就得先将数据大小发送过来,然后再发送实际的数组数据。

以上就是Python如何发送与接收大型数组的详细内容,更多关于Python发送接收大型数组的资料请关注WEB开发者其它相关文章!

扫描关注:"WEB开发者网“公众号,分享WEB开发知识,让开发变得更简单!

python同时发送与接收_Python如何发送与接收大型数组相关推荐

  1. 《Python Cookbook 3rd》笔记(3.9):大型数组运算

    大型数组运算 问题 你需要在大数据集 (比如数组或网格) 上面执行计算. 解法 涉及到数组的重量级运算操作,可以使用 NumPy 库. NumPy 的一个主要特征是它会给 Python 提供一个数组对 ...

  2. python群发手机短信_python实现发送和获取手机短信验证码

    首先为大家分享python实现发送手机短信验证码后台方法,供大家参考,具体内容如下 1.生成4位数字验证码 def createPhoneCode(session): chars=['0','1',' ...

  3. python 发送邮件附件很慢_Python SMTP 发送带附件电子邮件

    起始于对现有工作的内容进行部分重复工作的释放,花费了两周的时间调试了完全可能自己吼得住看得懂能实现目标的代码,如标题所说,本代码主要用户带附件的电子邮件的发送: 对于代码大家只需要修改下文件路径,邮箱 ...

  4. python同时发大量请求_Python批量发送post请求的实现代码

    昨天学了一天的Python(我的生产语言是java,也可以写一些shell脚本,算有一点点基础),今天有一个应用场景,就正好练手了. 这个功能之前再java里写过,比较粗糙,原来是在我本机跑的,今天老 ...

  5. python发短信脚本_python脚本发送短信

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. python附件发送到邮箱_python – 如何发送电子邮件附件?

    这是另一个: import smtplib from os.path import basename from email.mime.application import MIMEApplicatio ...

  7. python对二维数组排序_python学习笔记:二维数组排序问题

    首先先说一下题目:有一个文件,文件目录及名称:d:\\test1.txt 文件内容: 0001 Jone 1000.00 0002 Stone 30000.00 0008 Smith 50000.00 ...

  8. python 发送邮件正文字体设置_python 文字 坐标python smtplib模块发送SSL/TLS安全邮件实例...

    python的smtplib提供了一种很方便的途径发送电子邮件.它对smtp协议进行了简单的封装. smtp协议的基本命令包括: HELO 向服务器标识用户身份 MAIL 初始化邮件传输 mail f ...

  9. python群发短信脚本_python实现zabbix发送短信脚本

    本文实例为大家分享了zabbix发送短信的具体代码,供大家参考,具体内容如下 使用方法 ./sendSMS.py PHONE_NUMBER args_2 SMS_MSG 接收参数输入 参数一: 接收手 ...

最新文章

  1. 天地图,js 4.0 api,简单调用,高手请绕行
  2. 网络推广外包浅析当下网站优化处于健康状态有利于网络推广外包
  3. 隐藏模块(无模块注入)
  4. mysql cte 表不存在_使用CTE解决复杂查询的问题_MySQL
  5. java rc4_nodejs 和 java 进行 rc4 加密得到的结果不一样
  6. java 18.9_Oracle: Java 11 (18.9 LTS) 正式上线!
  7. 数组精选题目三连(6)
  8. 从零开始的服务器配置
  9. 5个冷门的MacOS快捷键,小众但好用
  10. 通信专业顶刊_通信类会议期刊排名(转)
  11. HTML5系列代码:信纸效果
  12. 在虚拟机、Mac 电脑和旧电脑上绕过 TPM 安装 Windows 11 的方法总结(提供通用无 TPM 检测镜像下载)
  13. 方舟生存进化服务器信息错误,方舟生存进化网络错误信息怎么办
  14. Android实现VR查看图片
  15. 以下11條小建議,幫助你們的異地戀一直保持活力
  16. oracle数据库恢复aul_ORACLE恢复神器之ODU/AUL/DUL
  17. centos7:在linux世界里,一切皆文件
  18. php获取证书编号没有serialNumberHex只有serialNumber处理方法
  19. Linux ffmpeg命令的使用
  20. 水の三角(超级卡特兰数/大施罗德数)

热门文章

  1. JDK1.8的新特性详解
  2. linux写文件操作同步,linux 可执行文件与写操作的同步问题(文件读写操作产生的锁机制)...
  3. orc parquet区别 spark_HIVE存储格式ORC、PARQUET对比
  4. markdown引入代码_第 09 篇:让博客支持 Markdown 语法和代码高亮
  5. 【JUC】第六章 Fork/Join 框架、CompletableFuture
  6. Mysql之索引优化案例
  7. WdatePicker日期插件
  8. 懒省事的小明(优先队列)
  9. 怎样快速提高新站权重收录
  10. Dnn's Event Logging API