2015-07-07 3 views
0

У меня есть два метода. Один метод, который извлекает некоторые данные, а другой - обрабатывает эти данные. Оба алгоритма работают с другой скоростью, поэтому я хочу синхронизировать производительность обоих алгоритмов, чтобы они работали со скоростью узкого места. Я думал об использовании очереди сообщений максимального размера. Пока очередь не достигнет максимального размера, метод поиска продолжает заполнять список, в то время как метод обработки удаляет элементы из списка в другом потоке до тех пор, пока в списке есть элементы. Если список достигает максимального размера, он будет ждать, пока очередь больше не будет иметь максимальный размер.Синхронизация производительности двух алгоритмов с характеристиками самого медленного узкого места

Это звучит как наиболее логичный подход?

Я думал о том или иной форме родового класса что-то вдоль линий

Queue<T> _theQueue; 
private int _maxQueueSize; 

Func<T> _processor; 
Func<T> _populator; 

ChasedQueue(Func<T> processor, Funct<T> populator, int maxQueueSize = 30) 
{ 
    _theQueue = new Queue<T>(); 
    _maxQueueSize = 
    _processor = processor; 
    _populator = populator; 
} 

public void Start() 
{ 
    new Thread(() => StartChaser()).Start(); 
    new Thread(() => StartPopulator()).Start(); 
} 

private void StartChaser() 
{ 
    while ((element = _documentQueue.poll) != null) 
    { 
     _processor(_documentQueue.Dequeue()); 
    } 
} 

private void StartPopulator() 
{ 
    foreach(var item in _populator) 
    { 
     while(_theQueue.Count < _maxQueueSize) 
     { 
      _documentQueue.Enqueue(item); 
     } 
    } 
} 
+0

ReactiveExtensions, а именно [Zip] (https://msdn.microsoft.com/en-us/library/system.reactive.linq. observable.zip% 28v = vs.103% 29.aspx), кажется хорошим подходом [[здесь] (http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html)]. Ваши два алгоритма просто выставляют свои потоковые результаты в качестве наблюдаемых, которые вы могли бы замерить ... –

+0

Это именно то, что я искал. Спасибо –

+0

@Patryk Ćwiek: Думаю, стоит упомянуть комментарий как ответ, так что вопрос можно закрыть. – sstan

ответ

1

продвигает мой комментарий к полноценному ответу, для полноты картины:

ReactiveExtensions, а именно Zip, кажется, словно хорошо подходит [example here]‌. Ваши два алгоритма просто выставляют свои потоковые результаты в качестве наблюдаемых, которые можно было бы закрепить ...

Смежные вопросы