通过Python套接字发送数千条消息

时间:2019-07-11 05:12:10

标签: python python-sockets

我有以下代码:

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套接字的工作方式。

1 个答案:

答案 0 :(得分:2)

您的初始代码有一个重大问题,因为使用后它不会关闭套接字。如果您以这种方式处理了数千条消息,那么您将保持数千个套接字连接的开放状态。因此,如果您原样使用初始代码,则需要在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()