如何在多个工作程序之间同步数据

时间:2013-10-26 15:08:52

标签: zeromq

我遇到了以下问题,即请求zmq解决方案。我有一个时间序列数据:

A,B,C,D,E,...

我需要在每个点上执行一个操作Func。

通过zmq使用多个worker来并行化任务是很有意义的。然而,让我沮丧的是如何同步结果,即结果应该按照输入数据的方式按时间排序。所以最终结果应如下所示:

Func(A), Func(B), Func(C), Func(D),...

我还应该指出,完成时间,比方说,Func(A)将与Func(B)略有不同。这可能要求我阻止一段时间。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您将始终需要阻止一段时间才能同步事物。您实际上可以将请求发送到工作池,并在收到响应时 - 如果它不是后续响应,则缓冲它。一个简单的工作流程可以用伪语言描述如下:

socket receiver; # zmq.PULL
socket workers; # zmq.DEALER, the worker thread socket is started as zmq.DEALER too.
poller = poller(receiver, workers);

next_id_req = incr()
out_queue = queue;
out_queue.last_id = next_id_req
buffer = sorted_queue;

sock = poller.poll()
if sock is receiver:
    packet_N = receiver.recv()
    # send N for processing
    worker.send(packet_N, ++next_id_req)

else if sock is workers:
   # get a processed response Func(N)
   func_N_response, id = workers.recv()
   if out_queue.last_id != id-1:
       # not subsequent id, buffer it
       buffer.push(id, func_N_rseponse)
   else:
       # in order, push to out queue
       out_queue.push(id, func_N_response)

       # also consume all buffered subsequent items
       while (out_queue.last_id == buffer.min_id() - 1):
           id, buffered_N_resp = buffer.pop()
           out_queue.push(id, buffered_N_resp)

但是问题就出现了如果数据包在处理线程(工作池)中丢失会发生什么..你可以在一定的超时后将其跳过(将缓冲区刷入队列),然后继续填写队列,并在数据包到来时重新排序,如果有的话。