У меня есть производитель с N потребителями.
Производитель прослушивает сокет, который получает большое количество сообщений TCP (10 000 в минуту), считывает эти данные и помещает их в очередь для рабочих.
Рабочие, которые я настроил для чтения из очереди, следующим образом:
iterations = 0
work_iterations = 0
while True:
try:
iterations += 1
data = queue.get(block=False)
work_iterations +=1
do_work(data)
except Queue.Empty:
time.sleep(0.001) #avoid high CPU usage
if iterations == 100:
load = float(work_iterations/iterations)
print load
iterations = 0
work_iterations = 0
Это упрощенный код, но вы можете видеть, что я пытаюсь увидеть загрузку рабочего процесса, но посмотреть, сколько итераций из 100 рабочий процесс фактически смог вытащить работу из очереди. Если нагрузка постоянно 100/100, то я знаю, что очередь производителей/потребителей становится невыполненной. Теоретически это должно работать.
То, что я вижу на выходе, это много 0,97, 0,99 и очень мало 1,0. Но очередь заполняется в течение нескольких минут (у нее ограничение по размеру 10 000), и мне приходится начинать сбрасывать данные на стороне производителя. Кто-нибудь может пролить свет на то, почему это происходит? Если рабочий процесс выполняет в среднем 97/100 итераций, это означает, что очередь должна быть близка к пустой, нет?