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