ZeroMQ,Redis和Gevent

时间:2013-11-04 17:47:37

标签: python performance redis zeromq gevent

我正在开发一个必须处理大量小数据请求的服务器 使用PULL / PUSH模式,使用ZeroMQ开发服务器 基本上每个请求过程都包括将其数据(消息)存储在Redis中。

我希望通过gevent处理每个请求,从而获得更好的性能 以下代码不起作用(消息不存储在Redis中)。

from gevent import monkey
monkey.patch_all()
from redis import Redis, StrictRedis
from redis import connection
import zmq
import gevent


context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.bind("tcp://*:5000")

connection.socket = gevent.socket
redis = Redis()

def enqueue(message):
    redis.lpush('work_queue', message)


while True:
    message = socket.recv()
    #print message
    gevent.spawn(enqueue, message)

如果我删除了gevent的东西,那么代码就可以了(消息存储正确)。

P.S。我刚开始玩zeromq和gevent。

更新:我想实现一个简单的任务队列。最终使用了芹菜。服务器(使用zmq)异步启动芹菜任务(并且效果很好)。

3 个答案:

答案 0 :(得分:2)

要将zeromq与gevent一起使用,您必须导入de zmq.green模块。

将zmq.green导入为zmq

http://zeromq.github.io/pyzmq/api/zmq.green.html

答案 1 :(得分:1)

您似乎没有启动事件循环。根据{{​​3}}的教程,尝试在gevent.joinall调用中包装spawn调用。试试看它是否有效。注意,这可能不是使用gevent的理想方式。但它应该是一个开始。

答案 2 :(得分:0)

使用redis-py pyzmq,我编写了一个演示版,gevent版本1.0.1,

参考文献:
(对不起,我的声誉不到10,我无法发布两个以上的2个链接):

[gevent with redis-py]
[gem with zmq]

参考链接只显示在演示代码中:)

该演示效果很好。 [ My demo code ]