Python 在ZeroRPC中实现自定义队列

Python 在ZeroRPC中实现自定义队列,python,zeromq,Python,Zeromq,目前,我正在使用ZeroRPC,我让“工作者”连接到“服务器”,并完成服务器发送给他们的工作 目前,只要有调用要进行,就会通过ZeroRPC进行调用,据我所知,它使用FIFO队列 我想使用我自己的队列,这样我可以限制/优先处理呼叫 我希望ZeroRPC公开一个gevent事件,当其内部队列为空时触发该事件。您要做的是在服务器中创建自己的工作队列。按你希望的优先顺序给自己打电话 由于没有几行代码比3卷中的任何吸血鬼故事表达得更多,让我们在伪代码中看看服务器会是什么样子: myqueue = MyS

目前,我正在使用ZeroRPC,我让“工作者”连接到“服务器”,并完成服务器发送给他们的工作

目前,只要有调用要进行,就会通过ZeroRPC进行调用,据我所知,它使用FIFO队列

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


我希望ZeroRPC公开一个gevent
事件,当其内部队列为空时触发该事件。

您要做的是在服务器中创建自己的工作队列。按你希望的优先顺序给自己打电话

由于没有几行代码比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)
由MySuperBadasQueue来完成所有的智能工作,如果你想节流,取消请求,如果必要的话会出现异常,等等

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

事实上,ZeroRPC中没有显式队列。发生了什么,是什么 先到先得,准确的顺序取决于双方 ZeroMQ和Gevent IOLoop(libevent或libev,取决于 版本)。碰巧在实践中,这很方便 就像一个FIFO队列


您要做的是在服务器中创建自己的工作队列。按你希望的优先顺序给自己打电话

由于没有几行代码比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)
由MySuperBadasQueue来完成所有的智能工作,如果你想节流,取消请求,如果必要的话会出现异常,等等

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

事实上,ZeroRPC中没有显式队列。发生了什么,是什么 先到先得,准确的顺序取决于双方 ZeroMQ和Gevent IOLoop(libevent或libev,取决于 版本)。碰巧在实践中,这很方便 就像一个FIFO队列


我自己没有试过,但我已经通读了资料来源。我很有动力,因为我想自己做这件事


似乎您要做的是继承
zerorpc.Server
并重写
\u acceptor
方法。根据
\u acceptor接收消息,然后生成线程来运行它们。因此,如果您更改逻辑/循环以合并您的队列,您可以使用它来调节。

我自己没有尝试过这一点,但我已经阅读了源代码。我很有动力,因为我想自己做这件事

似乎您要做的是继承
zerorpc.Server
并重写
\u acceptor
方法。根据\u acceptor接收消息,然后生成线程来运行它们。因此,如果您更改逻辑/循环以合并您的队列,您可以使用它来调节