Я пишу сбалансированный клиент-рабочий сервис без брокера, написанный на python с помощью ZeroMQ
.
Клиенты получают адрес работника, устанавливают соединение ( zmq.REQ / zmq.REP
), отправляют один запрос, получают один ответ и затем отключаются.
Я выбрал архитектуру без брокера, потому что объем данных, которые необходимо передать между клиентами и рабочими, относительно велик, несмотря на то, что для каждого соединения используется только одна пара REQ/REP
, и использование брокера в качестве «посредника» создать узкое место.
При тестировании системы я заметил, что связь между клиентами и воркерами прерывалась случайным образом, лишь иногда возобновляясь через пару секунд (часто несколько минут).
Я сузил проблему до .connect()
/.disconnect()
от клиентов до рабочих.
Я написал два небольших скрипта на Python, которые воспроизводят ошибку.
import zmq
class Site:
def __init__(self):
ctx = zmq.Context()
self.pair_socket = ctx.socket(zmq.REQ)
self.num = 0
def __del__(self):
print "closed"
def run_site(self):
print "running..."
while True:
self.pair_socket.connect('tcp://127.0.0.1:5555')
print 'connected'
self.pair_socket.send_pyobj(self.num)
print 'sent', self.num
print self.pair_socket.recv_pyobj()
self.pair_socket.disconnect('tcp://127.0.0.1:5555')
print 'disconnected'
self.num += 1
s = Site()
s.run_site()
и
import zmq
class Server:
def __init__(self):
ctx = zmq.Context()
self.pair_socket = ctx.socket(zmq.REP)
self.pair_socket.bind('tcp://127.0.0.1:5555')
def __del__(self):
print " closed"
def run_server(self):
print "running..."
while True:
x = self.pair_socket.recv_pyobj()
print x
self.pair_socket.send_pyobj(x)
s = Server()
s.run_server()
Я не думаю, что проблема связана с памятью или gc
, так как я пытался отключить gc
- без особого эффекта.
Я пытался использовать zmq.LINGER
, как описано здесь: Zeromq с python зависает при подключении к недопустимому сокету
Что может привести к зависанию этих случайных чисел?
while True: .connect(); ... ; .disconnect()
— это довольно жестокий способ с точки зрения базовых ресурсов и связанных с ними системных накладных расходов. Конечно, есть гораздо лучшие и более экологичные / более экологичные способы выразить свои дизайнерские намерения в коде, которые не будут тратить ресурсы ЦП / ресурсов. - person user3666197   schedule 27.05.2016