2015-10-27 55 views
0

我正在查看python3 asyncio,它看起来很棒,因为我来自gevent。但是,我仍然试图找出如何做到一切。比方说,我试图做一个简单的服务,连接到一个redis队列并从中弹出项目。事情变得非常快速:当对象被销毁时,我需要一个上下文管理器来关闭redis连接,我需要一个异步redis驱动程序,并且我需要捕获SIGINT和SIGTERM信号。从python2转到python3 asyncio gevent

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() 

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

回答

0

肯定看看aioredisasyncio-redis

我用过两种,目前我喜欢aioredis。它有上下文管理器(请参阅文档中的示例),它们正在整合Python 3.5语法。