首页 文章

从python2 gevent转到python3 asyncio

提问于
浏览
0

我正在查看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

    绝对看看aioredisasyncio-redis .

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

相关问题