我正在玩 gevent,我试图了解为什么我的代码被阻塞以及如何修复它。
我有一个 greenlets 池,它们每个都与一个从远程 thrift 服务器收集数据的 thrift 客户端交谈。出于练习的目的,thrift 服务器总是需要 > 1s 来返回任何数据。当我生成 greenlets 并运行 join 时,它们不会并行执行,而是一个接一个地执行。我的理解是,发生这种情况是因为我的代码是“阻塞的”,因为当我运行时monkey.patch_all()
,所有 greenlet 都神奇地并行运行。
那么如何让代码不阻塞自己,而不是让猴子修补所有东西而不理解它在做什么呢?
这里有一个我不明白的例子:
import time
from gevent.pool import Pool
def hello():
print 'Hello %d' % time.time()
time.sleep(1)
def main():
pool = Pool(5)
for _ in xrange(5):
pool.spawn(hello)
pool.join()
if __name__ == '__main__':
main()
输出
Hello 1345477112
Hello 1345477113
Hello 1345477114
Hello 1345477115
Hello 1345477116
我知道我可以使用 gevent.sleep,但是如何使用常规 time.sleep 使该功能非阻塞?
谢谢