Отправка тысяч сообщений через Python Socket - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующий код:

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» на мой графитовый сервер.Код открывает и закрывает сокет для каждого отправленного сообщения .... что я знаю, это ужасно.Прости меня.Я новичок в питоне.

Я ищу способ оптимизировать это.Я считаю, что открывать и закрывать сокет для каждого сообщения - очень плохая идея.Но я не могу найти способ обойти это.Я был бы признателен за любую помощь в этом.

Я думал так:

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 Ответ

2 голосов
/ 11 июля 2019

Ваш исходный код имеет существенную проблему в том, что он не закрывает сокет после его использования.Если бы вы обрабатывали тысячи сообщений таким образом, вы бы оставляли открытыми тысячи соединений с сокетами.Поэтому, если бы вы использовали исходный код как есть, вы бы хотели поставить 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()
...