我在单生产者/多消费者场景。考虑每个作业都是独立的,消费者之间不进行通信。
-
为每个消费者创建不同的队列是不是一个好主意?通过这种方式,生产者以循环的方式在每个队列中添加作业,并且在访问单个队列时没有延迟。
-
还是最好尽量减少队列的数量?
-
在单个队列和大量消费者(如20或更多)的情况下,由于同步访问队列而导致的延迟是否相关?
我使用Python 3.7和多线程/多处理来创建几个消费者。每个消费者都需要运行一个可执行文件并执行一些I/O操作(写、移动或复制文件)。我目前已经开发了多处理和单队列,但我正在考虑改变多线程和多队列的方法。
单一队列
Consumer
/
/ ..
Producer --> [ Queue ] -- Consumer
..
Consumer
多个队列
-> [ Queue ] -- Consumer
/
/ ..
Producer ----- -> [ Queue ] -- Consumer
..
-> [ Queue ] -- Consumer
特别是在一个生产者的情况下->这样做的好处是生产者只需要连接1个Queue,你可以启动任意数量的消费者来处理"下一个项目"。因为Python与Threading的关系非常复杂,所以我建议使用asyncio
和asyncio.Queue
。它非常直观,易于使用。
我最近复习了一下这个话题,我发现这个要点对理解它是如何工作的很有帮助。
在任何情况下,拥有更多的队列可能不会加快处理速度。只有当(处理消息的时间)<(从队列中获取消息),这在你的用例中不是这样的(与IO任务等)。