Проблема с использованием гринлета для одновременного выполнения нескольких функций - PullRequest
5 голосов
/ 13 июля 2011

Следующий скрипт предназначен для одновременного выполнения многих функций, но я не знаю, почему он работает неправильно.
Функции выполняются последовательно, а не параллельно.

Я быСпасибо за любые предложения, чтобы уточнить меня, о том, что я делаю неправильно.

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 голосов
/ 13 июля 2011

Вы правы в том, что time.sleep() является виновником.

Но вам не нужно заменять time.sleep() на eventlet.sleep(). Вместо этого вы можете обезьяньим патчем time.sleep стать eventlet.sleep.

Это, на самом деле, предпочтительнее, потому что таким образом библиотеки, которые вы не знали, используют time.sleep, также исправляются, тогда как если вы исправляете это самостоятельно, вы только исправляете свой код.

По этой причине в gevent мы просто рекомендуем вызывать gevent.monkey.patch_all() для всех программ. В eventlet есть похожая функция.

...