消费者如何回发到同一个 Disruptor 环形缓冲区
How a consumer posts back to the same Disruptor ring buffer
在多生产者设置中,有一个生产者线程和一个消费者线程。消费者可以 post 新事件返回到同一个环形缓冲区吗?我假设它在缓冲区已满时中断,并且消费者线程在处理当前事件时永远不会获得空闲插槽。换句话说,死锁发生了。
最好的方法是什么?我是否必须引入一种代理线程来接收来自消费者的事件并将它们 post 像普通生产者一样发送到环形缓冲区?
补充 - 为什么有用?
假设消费者线程正在处理股票市场数据事件,它需要向市场模拟器(一个类)发送订单,理想情况下,市场模拟器应该向同一个环形缓冲区发送订单执行事件。
如果您使用 Single producer
设置,那么消费者无法 post 返回环形缓冲区,因为它不是 Single producer
。
退后一步,为什么只有一个消费者需要写入环形缓冲区?它已经知道自己做了什么,并且不会从缓冲区中读取任何其他内容。
如果您有多个消费者,您可以写回缓冲区,但要确保额外的消费者受控于正在写回缓冲区的消费者,而不是生产者序列。
根据问题的其他细节提供单独的答案(我仍然相信我原来的答案是有效的)。
在我的 head/experience 中,您试图一次做很多事情,因为您将环形缓冲区的消费者和通常是独立问题的发布者混为一谈。我通常希望来自模拟器的响应事件以与处理原始事件相同的方式传送到环形缓冲区。
话虽如此,您所要求的实际上是可能的。
但是您必须自己做更多的工作并编写一个自定义 EventProcessor 允许您在尝试发布消息之前将传入消息标记为已处理(从而释放插槽)事件回来。
在多生产者设置中,有一个生产者线程和一个消费者线程。消费者可以 post 新事件返回到同一个环形缓冲区吗?我假设它在缓冲区已满时中断,并且消费者线程在处理当前事件时永远不会获得空闲插槽。换句话说,死锁发生了。
最好的方法是什么?我是否必须引入一种代理线程来接收来自消费者的事件并将它们 post 像普通生产者一样发送到环形缓冲区?
补充 - 为什么有用? 假设消费者线程正在处理股票市场数据事件,它需要向市场模拟器(一个类)发送订单,理想情况下,市场模拟器应该向同一个环形缓冲区发送订单执行事件。
如果您使用 Single producer
设置,那么消费者无法 post 返回环形缓冲区,因为它不是 Single producer
。
退后一步,为什么只有一个消费者需要写入环形缓冲区?它已经知道自己做了什么,并且不会从缓冲区中读取任何其他内容。
如果您有多个消费者,您可以写回缓冲区,但要确保额外的消费者受控于正在写回缓冲区的消费者,而不是生产者序列。
根据问题的其他细节提供单独的答案(我仍然相信我原来的答案是有效的)。
在我的 head/experience 中,您试图一次做很多事情,因为您将环形缓冲区的消费者和通常是独立问题的发布者混为一谈。我通常希望来自模拟器的响应事件以与处理原始事件相同的方式传送到环形缓冲区。
话虽如此,您所要求的实际上是可能的。
但是您必须自己做更多的工作并编写一个自定义 EventProcessor 允许您在尝试发布消息之前将传入消息标记为已处理(从而释放插槽)事件回来。