我有一个有 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),我必须开始在 Producer 端删除数据。任何人都可以阐明为什么会这样吗?如果工作进程平均进行 97/100 次迭代,这意味着队列应该接近空,不是吗?