使用greenlet同时执行多个函数时遇到问题
下面这个脚本的目的是想要同时执行很多个函数,但我不知道为什么它没有正确工作。
这些函数是一个接一个地执行,而不是同时执行。
如果有人能给我一些建议,帮我弄清楚我哪里做错了,我会非常感激。
import time
import eventlet
EXECUTION_TIMEOUT = 10
def example(name, steps_limit):
print 'Starting process %s with %d steps' % (name, steps_limit)
for i in range(1, steps_limit+1):
print "Process %s, step %d" % (name, i)
time.sleep(2)
print 'Finishing process %s with %d steps' % (name, steps_limit)
def fetch(input_data):
example(input_data['name'], input_data['steps'])
test_data = [{'name':'proceso1', 'steps':3},
{'name':'proceso2', 'steps':5},
{'name':'proceso3', 'steps':6},
]
def main():
#Setting up time out
timeout = eventlet.timeout.Timeout(EXECUTION_TIMEOUT)
#initialize pool
pool = eventlet.GreenPool(size=1000)
try:
for hits in pool.imap(fetch, test_data):
pass
except eventlet.Timeout:
print 'Operation interrupted by timeout concept'
finally:
timeout.cancel()
if __name__ == '__main__':
main()
1 个回答
2
你说得对,time.sleep()
确实是问题所在。
不过,你不需要把 time.sleep()
替换成 eventlet.sleep()
。其实,你可以把 time.sleep
修改成 eventlet.sleep
。
这样做其实更好,因为这样你不知道的其他库如果也用到了 time.sleep
,它们也会被修复。如果你只是自己修复了,那只有你的代码能正常工作。
所以在 gevent 中,我们建议所有程序都调用 gevent.monkey.patch_all()
。在 eventlet 中,也有类似的功能。