나는 N 개의 소비자로 구성된 프로듀서를 가지고있다.파이썬 프로세스 간 큐 오버플로
생산자는 대량의 TCP 메시지 (1 분당 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
이 코드를 단순화,하지만 당신은 내가 작업자 부하를 볼 수 있지만 얼마나 많은 반복을 볼려고 볼 수 있습니다
노동자는 I는 다음과 같이 큐에서 읽을-설정 한 100의 직원은 실제로 대기열에서 작업을 끌어낼 수있었습니다. 부하가 지속적으로 100/100이라면 생산자/고객 대기열이 백 로그됨을 알게됩니다. 이론적으로이 은이어야합니다.
출력에서 볼 수있는 것은 0.97, 0.99 및 매우 적은 1.0입니다. 그러나 큐는 몇 분 내에 채우지 만 (크기 제한은 10,000입니다), 프로듀서 쪽에서 데이터를 삭제해야합니다. 왜 이런 일이 일어나고 있는지 조명하는 사람이 있습니까? 작업자 프로세스가 평균 97/100 회 반복 작업을하는 경우 대기열이 빈 no에 가까워 야 함을 의미합니까?