V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Zuckonit
V2EX  ›  问与答

请教一个 gevent 的问题

  •  
  •   Zuckonit · 2014-08-04 11:08:30 +08:00 · 3203 次点击
    这是一个创建于 3789 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有这样一个需求,
    我要从redis的key里面取东西,但是这些key是不定的(命名有一定规则), 我现在的想法是通过一个协程没一秒去扫描存活的key, 存入AsyncResult里面, 然后在其他协程里面使用这些key之前先从这个AsyncResult里面取值。这样有个问题, 如果在协程运行起来后, 新加入了key, 下面的代码不能捕获到新的key了, 求解。

    import gevent, redis

    alive_keys = gevent.event.AsyncResult()
    def get_alive_keys():
    ----client = redis.StrictRedis(host='localhost')
    ----while 1:
    --------try:
    ------------keys = client.keys('alive*balabala*')
    ------------alive_keys.set(keys)
    --------except:
    ------------pass
    --------gevent.sleep(1)

    def foo(key):
    ----balabala....

    try:
    ----keys = alive_keys.get()
    ----tasks = [gevent.spawn(foo, key) for key in keys]
    ----tasks.append(gevent.spawn(get_alive_keys))
    ----gevent.joinall(tasks)
    except:
    ----pass
    4 条回复    2014-08-04 15:21:35 +08:00
    KDr2
        1
    KDr2  
       2014-08-04 12:24:44 +08:00
    alive_keys.get之前,get_alive_keys还没spawn啊,更没运行,当然是空的了。可以先调用一次来初始化。

    另外你的 foo 如果也是周期性调用的话,得每次调用或者 spanw 前重新 alive_keys.get() 不然 keys 永远是第一次拿到的存活 keys
    zjxubinbin
        2
    zjxubinbin  
       2014-08-04 13:50:55 +08:00
    缓存的缓存真的有必要嚒?
    Zuckonit
        3
    Zuckonit  
    OP
       2014-08-04 15:21:26 +08:00
    @KDr2 每次spawn之前重新alive_keys.get() 这样可以吗?, 我是一个key开一个协程啊tasks = [gevent.spawn(foo, key) for key in keys]
    Zuckonit
        4
    Zuckonit  
    OP
       2014-08-04 15:21:35 +08:00
    @zjxubinbin 求指点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1237 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:52 · PVG 01:52 · LAX 09:52 · JFK 12:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.