V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Zuckonit
V2EX  ›  问与答

请教一个 gevent 的问题

  •  
  •   Zuckonit · Aug 4, 2014 · 3735 views
    This topic created in 4284 days ago, the information mentioned may be changed or developed.
    现在有这样一个需求,
    我要从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 replies    2014-08-04 15:21:35 +08:00
    KDr2
        1
    KDr2  
       Aug 4, 2014
    alive_keys.get之前,get_alive_keys还没spawn啊,更没运行,当然是空的了。可以先调用一次来初始化。

    另外你的 foo 如果也是周期性调用的话,得每次调用或者 spanw 前重新 alive_keys.get() 不然 keys 永远是第一次拿到的存活 keys
    zjxubinbin
        2
    zjxubinbin  
       Aug 4, 2014
    缓存的缓存真的有必要嚒?
    Zuckonit
        3
    Zuckonit  
    OP
       Aug 4, 2014
    @KDr2 每次spawn之前重新alive_keys.get() 这样可以吗?, 我是一个key开一个协程啊tasks = [gevent.spawn(foo, key) for key in keys]
    Zuckonit
        4
    Zuckonit  
    OP
       Aug 4, 2014
    @zjxubinbin 求指点
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3204 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 00:03 · PVG 08:03 · LAX 17:03 · JFK 20:03
    ♥ Do have faith in what you're doing.