Ответ 1
Это просто чистая и хорошая практика, когда вы имеете дело со множеством вещей. Я столкнулся с этим несколько недель назад, когда использовал gevent spawn, чтобы проверить кучу писем от DNS порядка 30k:).
from gevent.pool import Pool
import logging
rows = [ ... a large list of stuff ...]
CONCURRENCY = 200 # run 200 greenlets at once or whatever you want
pool = Pool(CONCURRENCY)
count = 0
def do_work_function(param1,param2):
print param1 + param2
for row in rows:
count += 1 # for logging purposes to track progress
logging.info(count)
pool.spawn(do_work_function,param1,param2) # blocks here when pool size == CONCURRENCY
pool.join() #blocks here until the last 200 are complete
Я обнаружил в своем тестировании, что когда CONCURRENCY было около 200, когда моя загрузка машины зависает около 1 на EC2 m1.small. Я сделал это немного наивно, хотя, если бы я снова это сделал, я бы запускал несколько пулов и некоторое время находился между ними, чтобы попытаться распределить нагрузку на NIC и CPU более равномерно.
Последнее, что нужно иметь в виду - следить за открытыми файлами и увеличивать это, если нужно: http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files. Зелёные звёзды, которые я запускал, занимали около 5 дескрипторов файлов на каждую зелени, поэтому вы можете быстро закончиться, если не будете осторожны. Это может быть не очень полезно, если ваша загрузка системы выше единицы, поскольку вы начнете видеть уменьшающиеся возвраты независимо.