【发布时间】:2012-08-20 15:45:36
【问题描述】:
我正在玩 gevent,我试图了解为什么我的代码会阻塞以及如何修复它。
我有一个 greenlets 池,它们每个都与一个 thrift 客户端通信,该客户端从远程 thrift 服务器收集数据。出于练习的目的,thrift 服务器总是需要 > 1s 来返回任何数据。
当我生成 greenlets 并运行 join 时,它们不会并行执行,而是一个接一个地执行。我的理解是,发生这种情况是因为我的代码“阻塞”了,因为当我运行monkey.patch_all() 时,所有greenlets 神奇地并行运行。
那么我如何让代码不阻塞自己而不是猴子修补所有东西而不了解它在做什么?
这里有一个我不明白的例子:
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 使该功能非阻塞?
谢谢
【问题讨论】:
-
如果你全部打补丁,
time.sleep()将被gevent.sleep()替换。 -
@Ivella,但在我的节俭客户端的情况下,如何在不使用全部猴子补丁的情况下编写它以使其成为非阻塞?
标签: python nonblocking gevent