python - 通过 Python Socket 发送数千条消息
问题描述
我有以下代码:
for mydetails in allthelists:
hostype = mydetails[0]
graphType = mydetails[1]
hostNodeName = mydetails[2]
frequency = mydetails[3]
diskName = mydetails[4]
avgOfMultiDays = mydetails[5]
eachEpoch = mydetails[6]
messageA = '{hostype}.{graphType}.{hostNodeName}.{frequency}.{diskName}-altavg {avgOfMultiDays} {eachEpoch}\n'.format(**locals())
print 'sending message:\n%s' % messageA
sock = socket.socket()
sock.connect((CSERVER, CPORT))
sock.sendall(messageA)
我遇到的问题是我必须向我的石墨服务器发送数千个“messageA”。代码为发送的每条消息打开和关闭套接字....我知道这很糟糕。对不起。我是 python 新手。
我正在寻找一种方法来优化它。我相信为每条消息打开和关闭一个套接字是一个非常糟糕的主意。但我似乎无法找到解决方法。我将不胜感激这方面的任何帮助。
我的思路是:
messageA = "blah blah blah"
messageB = "blah blah blah"
messageC = "blah blah blah"
..... and so on
#then,
sock = socket.socket()
sock.connect((CSERVER, CPORT))
sock.sendall(messageA,messageB,messageC,.....)
但这不是 python 套接字的工作方式。
解决方案
您的初始代码有一个重大问题,即它在使用后没有关闭套接字。如果您以这种方式处理了数千条消息,您将打开数千个套接字连接。因此,如果您要按原样使用初始代码,则需要sock.close()
在sock.sendall()
.
您真正想要在这里做什么取决于服务器的期望。对于侦听套接字的任意服务器来说,您可以在每个连接上发送一条消息或在单个连接上发送一堆消息,这不一定是正确的。由于您正在使用 EOL 终止您的消息,因此服务器可以使用它来了解每条消息的结尾在哪里(一行是一条消息),在这种情况下它可以处理多条消息。但是,服务器也有可能希望每个连接只收到一条消息,在这种情况下,您将被迫执行您在初始代码块中所做的事情。
假设您可以在单个连接上发送多条消息,您想要执行@GarethMa 建议的操作......只需在循环和处理您发送的每条消息之前创建并连接套接字:
sock = socket.socket()
sock.connect((CSERVER, CPORT))
for mydetails in allthelists:
hostype = mydetails[0]
graphType = mydetails[1]
hostNodeName = mydetails[2]
frequency = mydetails[3]
diskName = mydetails[4]
avgOfMultiDays = mydetails[5]
eachEpoch = mydetails[6]
messageA = '{hostype}.{graphType}.{hostNodeName}.{frequency}.{diskName}-altavg {avgOfMultiDays} {eachEpoch}\n'.format(**locals())
print 'sending message:\n%s' % messageA
sock.sendall(messageA)
socket.close()
推荐阅读
- firebird - Firebird 为 sysdba 用户更改默认密码后不会忘记默认密码
- php - 从 PHP 数组中提取值并回显来自 Curl 脚本的 HTML 页面多维响应
- python - Python:请求 ID 线程本地日志记录
- sql - 如何将最小值和最大值定义为 postgresql 字段的范围?
- ios - 我可以在不上传新应用版本的情况下添加新的应用内购买产品吗?
- powerbi - 根据另一个表中的两列求和
- python - 通过 Python 中的函数式编程制作列表
- html - 我可以使此复选框隐藏/显示同一部分中但在不同类下的元素吗?
- java - VS Code 在集成终端而不是 java 的调试控制台中开始调试
- postgresql - 一个 sql 查询不应该返回空?