在ZeroRPC中实现自定义队列

时间:2012-12-05 13:30:26

标签: python zeromq

目前,我正在使用ZeroRPC,我有“工作人员”连接到“服务器”并完成服务器发送它们的工作。

目前,只要有调用make就调用ZeroRPC,据我所知它使用FIFO队列。

我想使用自己的队列,以便限制/优先处理呼叫。

我希望ZeroRPC公开一个gevent Event,当它的内部队列运行为空时会触发它。

2 个答案:

答案 0 :(得分:3)

您要做的是在服务器中创建自己的工作队列。并按照您希望的优先级调度自己。

由于几行代码比3卷中的任何吸血鬼故事更多,让我们在伪代码中看到服务器的外观:

myqueue = MySuperBadAssQueue()

def myqueueprocessor():
  for request in myqueue: # blocks until next request
    gevent.spawn(request.processme) # do the job asynchronously

gevent.spawn(myqueueprocessor) # do that at startup

class Server:

  def dosomething(args...blabla...):  # what users are calling
    request = Request(args...blabla...)
    myqueue.put(request)  # something to do buddy!
    return request.future.get() # return when request is completed
                                # (can also raise an exception)

# An example of what a request could look like:
class Request:
  def __init__(self, ....blablabla...):
    self.future = gevent.AsyncResult()

   def process():
     try:
         result = someworker(self.args*) # call some worker
         self.future.set(result) # complete the initial request
     except Exception as e:
         self.future.set_exception(e)

由MySuperBadAssQueue完成所有智能工作,如果需要可以限制,如有必要,可以取消带有异常的请求等等。

ZeroRPC不会公开任何事件,让您知道其“内部”队列是否运行 空:

  

实际上,ZeroRPC中没有明确的队列。会发生什么事,是   只是先到先得,确切的顺序取决于两者   ZeroMQ和Gevent IOLoop(libevent或libev取决于   版)。碰巧在实践中,这很方便   就像一个FIFO队列。

答案 1 :(得分:1)

我自己没有尝试过这个,但我已经阅读了这篇文章。我很有动力因为我想自己做这件事。

看起来你要做的就是继承zerorpc.Server并覆盖_acceptor方法。根据{{​​3}},_acceptor是接收消息然后生成线程来运行它们的内容。因此,如果您更改逻辑/循环以合并您的队列,您可以使用它来限制。