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

rma*_*oft 5 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()
Run Code Online (Sandbox Code Playgroud)

Den*_*nko 2

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

但您不必替换time.sleep()eventlet.sleep(). 相反,你可以猴子补丁time.sleep成为eventlet.sleep.

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

因此,在gevent中,我们只建议调用gevent.monkey.patch_all()所有程序。在eventlet中,也有类似的函数。