使用greenlet同时执行多个功能的问题

时间:2011-07-12 22:08:23

标签: python multithreading coroutine

以下脚本的目的是同时执行许多功能,但我不知道它为什么不能正常工作。
函数以顺序方式执行,而不是并行执行。

我很感激有任何建议要澄清我,我做错了什么。

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 个答案:

答案 0 :(得分:2)

关于time.sleep()是罪魁祸首你是对的。

但您不必将time.sleep()替换为eventlet.sleep()。相反,您可以将补丁time.sleep变为eventlet.sleep

事实上,这是首选,因为您不知道使用time.sleep的库也会被修复,而如果您自己修复它,则只修复您的代码。

因此,在gevent中,我们建议您为所有程序调用{​​{1}}。在eventlet中,存在类似的功能。