使用greenlet同时执行多个函数时遇到问题

5 投票
1 回答
1409 浏览
提问于 2025-04-16 21:23

下面这个脚本的目的是想要同时执行很多个函数,但我不知道为什么它没有正确工作。
这些函数是一个接一个地执行,而不是同时执行。

如果有人能给我一些建议,帮我弄清楚我哪里做错了,我会非常感激。

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 中,也有类似的功能。

撰写回答