Безопасен ли пул gevent

Итак, у меня есть функция, скажем, test и gevent pool размером 10.

pool.Pool(size=10)
def test():
    pool.wait_available(timeout=0.5)
    pool.spawn(something)

Если проверка функции вызывается разными потоками, это вызовет какие-либо проблемы. Я имею в виду wait_availableдолжен быть потокобезопасным, но pool.spawn будет ли у него проблема безопасности потока / состояния гонки. Я имею в виду, допустим, что уже запущено 9 гринлетов и есть пара запросов, вызывающих тестовую функцию. Они оба будут читать pool.wait_available, который не должен блокировать, но сразу после этого pool.spawn сделает один из них заблокированным.

Я просто хочу убедиться, что pool.spawn не блокируется в течение указанного периода времени. Как я могу сделать это?

1 ответ

wait_available не требуется, если вы используете spawn от pool так как spawn попросит lock в PoolВнутренний семафор, используемый для отслеживания бегущих гринлетов. Исключением из этого является только когда вы используете apply_async, Я объясню оба сценария здесь:

pool.Pool(size=10)
def test():
    for i in xrange(20):
        log('Processing {}'.format(i))
        pool.spawn(something)
    pool.join()
    log('Done')

Вывод этого показывает, что он будет порождать гринлеты группами по 10, так как пул содержит пространство для 10:

1531531331: Processing 0
1531531331: Processing 1
1531531331: Processing 2
1531531331: Processing 3
1531531331: Processing 4
1531531331: Processing 5
1531531331: Processing 6
1531531331: Processing 7
1531531331: Processing 8
1531531331: Processing 9
1531531340: Processing 10
1531531340: Processing 11
1531531340: Processing 12
1531531340: Processing 13
1531531340: Processing 14
1531531340: Processing 15
1531531340: Processing 16
1531531340: Processing 17
1531531340: Processing 18
1531531340: Processing 19
1531531349: Done

И наоборот, если вы используете apply_Async вместо вызова порождает одновременное выполнение всех вызовов. Здесь будет условие гонки для всех гринлетов, чтобы немедленно начать выполнение.

1531531357: Processing 0
1531531357: Processing 1
1531531357: Processing 2
1531531357: Processing 3
1531531357: Processing 4
1531531357: Processing 5
1531531357: Processing 6
1531531357: Processing 7
1531531357: Processing 8
1531531357: Processing 9
1531531357: Processing 10
1531531357: Processing 11
1531531357: Processing 12
1531531357: Processing 13
1531531357: Processing 14
1531531357: Processing 15
1531531357: Processing 16
1531531357: Processing 17
1531531357: Processing 18
1531531357: Processing 19
1531531367: Done

Если вы используете wait_available() в начале вы возвращаетесь к аналогичному поведению spawn, Итак, если вы используете Spawn, вам не нужно wait_available() поскольку они делают ту же самую проверку (проверяя семафор, чтобы видеть, есть ли место в пуле).

Надеюсь, поможет! Gevent потрясающий! Удачного кодирования!

Другие вопросы по тегам