我遇到了以下问题,即请求zmq解决方案。我有一个时间序列数据:
A,B,C,D,E,...
我需要在每个点上执行一个操作Func。
通过zmq使用多个worker来并行化任务是很有意义的。然而,让我沮丧的是如何同步结果,即结果应该按照输入数据的方式按时间排序。所以最终结果应如下所示:
Func(A), Func(B), Func(C), Func(D),...
我还应该指出,完成时间,比方说,Func(A)将与Func(B)略有不同。这可能要求我阻止一段时间。
任何建议都将不胜感激。
答案 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)
但是问题就出现了如果数据包在处理线程(工作池)中丢失会发生什么..你可以在一定的超时后将其跳过(将缓冲区刷入队列),然后继续填写队列,并在数据包到来时重新排序,如果有的话。