簡體   English   中英

zmq / zeromq recv_multipart掛在大數據上

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM