目前,我正在使用ZeroRPC,我有“工作人员”连接到“服务器”并完成服务器发送它们的工作。
目前,只要有调用make就调用ZeroRPC,据我所知它使用FIFO队列。
我想使用自己的队列,以便限制/优先处理呼叫。
我希望ZeroRPC公开一个gevent Event
,当它的内部队列运行为空时会触发它。
答案 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
是接收消息然后生成线程来运行它们的内容。因此,如果您更改逻辑/循环以合并您的队列,您可以使用它来限制。