Безопасен ли пул 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 потрясающий! Удачного кодирования!