【问题标题】:ZeroMQ, Redis and GeventZeroMQ、Redis 和 Gevent
【发布时间】:2013-11-15 10:23:27
【问题描述】:

我正在开发一个必须处理大量小数据请求的服务器。
服务器是用 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 的东西,那么代码就可以工作(消息存储正确)。

附:我刚开始玩 zeromq 和 gevent。

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

【问题讨论】:

    标签: python performance redis zeromq gevent


    【解决方案1】:

    用redis-py pyzmq,我写了一个demo,gevent 1.0.1版,

    参考:
    (对不起,我的声誉不到 10,我不能发布超过两个 2 的链接):

    [ 使用 redis-py 的 gevent ]
    [ gevent 与 zmq ]

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

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

    【讨论】:

    • 谢谢!我会试试你的演示(尽快)。
    【解决方案2】:

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

    将 zmq.green 导入为 zmq

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 2014-11-17
        相关资源
        最近更新 更多