从python2 gevent转移到python3 asyncio

时间:2015-10-27 17:30:27

标签: python python-3.x python-asyncio

我正在查看python3 asyncio,它看起来非常棒,因为我来自gevent。但是,我仍然在试图弄清楚如何做所有事情。假设我正在尝试连接到redis队列并从中弹出项目的简单服务。事情很快就失控了:当对象被破坏时我需要一个上下文管理器关闭redis连接,我需要一个异步redis驱动程序,我需要捕获SIGINT和SIGTERM信号。

import asyncio
import asyncio_redis

class Agent(object):
    def __init__(self, name):
        print("hello, i'm %s" % name)
        self.name = name
        self.running = True

        # self.redis should become an instance of asyncio_redis.Connection

    def shutdown(self):
        self.running = False

    def __enter__(self):
        return self

    def __exit__(self):
        print("%s cleaned up" % name)
        self.redis.close()

    def loop(self):
        print("%s started looping" % name)
        while self.running:
            # msg should get a value from self.redis.brpop(["queue"], 10)
            if msg:
                print "%s recv %s" % (name, msg)
            else:
                pass

if __name__ == "__main__":

    loop = asyncio.get_event_loop()
    try:
        with a as Agent("agent1"):
            loop.add_signal_handler(signal.SIGINT, a.shutdown)
            loop.run_until_complete( a.loop() )
    finally:
        loop.stop()
        loop.close()

任何人都可以完成代码并使其运行吗?感谢。

1 个答案:

答案 0 :(得分:0)

绝对可以查看aioredisasyncio-redis

我已经使用了两者,目前我喜欢aioredis。它有上下文管理器(参见文档中的示例),并且它们结合了Python 3.5语法。