[英]zmq/zeromq recv_multipart hangs on large data
我正在嘗試修改一個Zeromq 示例來處理后台任務並使它工作。 特別是,我有一個xpub / xsub套接字設置,客戶端將訂閱發布者以接收來自工作程序的進度更新和結果。
worker_server.py
proxy = zmq.devices.ThreadDevice(zmq.QUEUE, zmq.XSUB, zmq.XPUB)
proxy.bind_in('tcp://127.0.0.1:5002')
proxy.bind_out('tcp://127.0.0.1:5003')
proxy.start()
client.py
ctx = zmq.Context()
socket = server.create_socket(ctx, 'sub')
socket.setsockopt(zmq.SUBSCRIBE, '')
poller = zmq.Poller()
print 'polling'
poller.register(socket, zmq.POLLIN)
ready = dict(poller.poll())
print 'polling done'
if ready and ready.has_key(socket):
job_id, code, result = socket.recv_multipart()
return {'status': code, 'data': result}
到目前為止,該代碼適用於較小的消息,但是當工作人員嘗試發布較大的任務結果35393030字節時,客戶端未收到該消息,並且代碼掛起在ready = dict(poller.poll())
現在,我剛開始學習使用zmq,但是send_multipart是否不應該對消息進行分塊? 是什么導致客戶端無法收到結果
worker.py
def worker(logger_name, method, **task_kwargs):
job_id = os.getpid()
ctx = zmq.Context()
socket = create_socket(ctx, 'pub')
time.sleep(1)
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
sh = WSLoggingHandler(socket, job_id)
fh = logging.FileHandler(filename=os.path.join(tmp_folder, 'classifier.log.txt'), encoding='utf-8')
logger.addHandler(ch)
logger.addHandler(sh)
logger.addHandler(fh)
modules_arr = method.split('.')
m = __import__(".".join(modules_arr[:-1]), globals(), locals(), -1)
fn = getattr(m, modules_arr[-1])
try:
results = fn(**task_kwargs)
print 'size of data file %s' %len(results)
data = [
str(job_id),
SUCCESS_CODE,
results
]
tracker = socket.send_multipart(data)
print 'sent!!!'
except Exception, e:
print traceback.format_exc()
socket.send_multipart((
str(job_id),
ERROR_CODE,
str(e)
))
finally:
socket.close()
編輯:嘗試手動將結果分成較小的塊,但避風港已成功。
results = fn(**task_kwargs)
print 'size of data file %s' %len(results)
data = [
str(job_id),
SUCCESS_CODE,
] + [results[i: i + 20] for i in xrange(0, len(results), 20)]
print 'list size %s' %len(data)
tracker = socket.send_multipart(data)
print 'sent!!!'
來自pyzmq文檔: https ://zeromq.github.io/pyzmq/api/zmq.html#zmq.Socket.send_multipart
msg_parts:可迭代
要作為多部分消息發送的一系列對象。 每個元素可以是任何可發送對象(幀,字節,緩沖區提供程序)
消息不會自動分塊,您傳遞的可迭代的每個元素都是分塊。 因此,按照設置方式,所有結果數據將都是一個塊。 您需要使用迭代器,將結果分塊為適當的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.