请教一个 gevent 的问题

2014-08-04 11:08:30 +08:00
 Zuckonit
现在有这样一个需求,
我要从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
3074 次点击
所在节点    问与答
4 条回复
KDr2
2014-08-04 12:24:44 +08:00
alive_keys.get之前,get_alive_keys还没spawn啊,更没运行,当然是空的了。可以先调用一次来初始化。

另外你的 foo 如果也是周期性调用的话,得每次调用或者 spanw 前重新 alive_keys.get() 不然 keys 永远是第一次拿到的存活 keys
zjxubinbin
2014-08-04 13:50:55 +08:00
缓存的缓存真的有必要嚒?
Zuckonit
2014-08-04 15:21:26 +08:00
@KDr2 每次spawn之前重新alive_keys.get() 这样可以吗?, 我是一个key开一个协程啊tasks = [gevent.spawn(foo, key) for key in keys]
Zuckonit
2014-08-04 15:21:35 +08:00
@zjxubinbin 求指点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/125996

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX