我在客户端(生产者)有8个线程,在服务器端有1个线程(消费者)
消费者线程正在旋转检查新数据是否到来。我有两种方法可以实现这个:
使用一个concurrent queue,所有8个生产者发布到同一个队列,服务器旋转和try_pop
使用8个无锁single producer single consumer queue。每个生产者帖子都有自己的队列,但消费者应该检查8个查询而不只是一个。
我认为检查8个无锁查询必须比检查一个阻塞队列快得多(导致阻塞很昂贵!)。所以我倾向于使用8个spsc_queue。如果我是对的,你能建议什么?
答案 0 :(得分:1)
答案很大程度上取决于您的系统架构。首先,如果您的8个线程确实可以并行运行,请查看harware_concrurrency()
:
如果您有足够的可用硬件核心(如果它们没有被其他进程占用),您的旋转实际上可以通过使用所有硬件容量来提高客户端大小的吞吐量。在这种情况下,单个锁定队列会降低客户端核心的速度:队列同步可能是他们的瓶颈,迫使他们一个接一个地运行。如果你有8个独立的队列,那么消费者只会减慢一个队列的速度。
如果没有,那么每个线程将始终等待,而其他线程正在工作。在这种情况下,单个锁定队列不应对整体性能产生显着影响。但旋转不会提高性能(事实上,上下文切换甚至可能会略微减少)并且应该考虑一个批判性思维。
在这两种情况下,单个消费者一次只能处理一个项目。对于消费来说,如果从8个队列或1个队列中读取,则不应产生巨大差异。
但是你看到事情很复杂。如果生产者以不同的速度运行(更高优先级或在另一个处理器上运行,或者消耗代码明显短于生成代码),则需要重新考虑分析。所以建议预见一些基准测试(端到端吞吐量)。