我正在开发一个必须处理大量小数据请求的服务器。
服务器是用ZeroMQ开发的,使用PULL/PUSH模式。
基本上每个请求过程都包括将其数据(消息)存储在 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 内容,那么代码就可以工作(消息正确存储)。
附言我刚刚开始玩零mq和gevent。
更新:我想实现一个简单的任务队列。最终使用了芹菜。服务器(使用 zmq)异步启动芹菜任务(效果很好)。
要将 zeromq 与 gevent 一起使用,您必须导入 de zmq.green 模块。
导入 zmq.green 作为 zmq
http://zeromq.github.io/pyzmq/api/zmq.green.html
您似乎没有启动事件循环。根据教程 http://sdiehl.github.io/gevent-tutorial/尝试将生成调用包装在 gevent.joinall 调用中。尝试一下,看看它是否有效。注意,这可能不是使用 gevent 的理想方式。但这应该是一个开始。
使用 Redis-py pyzmq,我写了一个演示,gevent 版本 1.0.1,
引用:
(对不起,我的声誉不到10,我不能发布超过两个2链接):
[ gevent with redis-py ]
[ gevent with zmq ]
参考链接仅显示在演示代码:)
该演示效果很好。 [ 我的演示代码 ]