If the number of producers or consumers is only known at runtime (e.g., based on configuration), use the build_multi_producer builder pattern. You can iteratively call new_event_poller() to add consumers and then clone() the final producer to create multiple producers.
Note: You must have at least one consumer and one producer.
fn build_disruptor<E, F, W>(
size: usize,
event_factory: F,
wait_strategy: W,
producer_count: usize,
consumer_count: usize,
) -> Result<(
Vec<MultiProducer<E, MultiConsumerBarrier>>,
Vec<EventPoller<E, MultiProducerBarrier>>,
)>
where
F: FnMut() -> E,
E: 'static + Send + Sync,
W: 'static + WaitStrategy,
{
if producer_count == 0 || consumer_count == 0 {
bail!("Must have at least one consumer and producer.");
}
let mut builder = disruptor::build_multi_producer(size, event_factory, wait_strategy)
.with_multi_consumer();
// Create consumers (EventPollers):
let mut consumers = Vec::new();
for _ in 0..consumer_count {
let (poller, next_builder) = builder.new_event_poller();
consumers.push(poller);
builder = next_builder;
}
// Create producers:
let producer = builder.build();
let mut producers = Vec::new();
for _ in 1..producer_count {
producers.push(producer.clone());
}
producers.push(producer);
Ok((producers, consumers))
}