разбить данные на куски, а затем обеспечить безопасность потоков

я пишу некоторый код, который в основном получает данные из сокета, выполняет десериализацию, а затем передает моему приложению. Десериализованные объекты могут быть сгруппированы по их идентификаторам (идентификатор создается в процессе десериализации).

чтобы повысить производительность моего приложения, я хотел использовать новые возможности параллелизма, которые появились в C# 4.0. единственное ограничение, которое у меня есть, заключается в том, что 2 потока не могут получить доступ к объекту с одним и тем же идентификатором. теперь я знаю, что могу просто выполнить lock() для объекта синхронизации, который будет помещен внутри объекта, но я хочу избежать этих блокировок (здесь проблема с производительностью).

Дизайн, о котором я думал:

  1. создайте какой-нибудь разделитель, который будет разделять данные по идентификатору (это гарантирует, что каждый буфер, который я получу, всегда будет иметь одну и ту же группу идентификаторов объектов вместе).
  2. назначить поток с помощью TPL PLINQ

может кто-нибудь предложить мне некоторые источники, которые делают это?


person Tzahi    schedule 12.08.2012    source источник


Ответы (1)


Я бы предложил PLINQ при разработке для нескольких процессоров или ядер.

PLINQ — это механизм выполнения запросов, который принимает любые запросы LINQ-to-Objects или LINQ-to-XML и автоматически использует для выполнения несколько процессоров или ядер, когда они доступны. Изменения в модели программирования незначительны, а это означает, что вам не нужно быть гуру параллелизма, чтобы использовать их. На самом деле потоки и блокировки даже не появятся, если вы действительно не хотите нырнуть под капот, чтобы понять, как все это работает. PLINQ является ключевым компонентом Parallel FX, следующего поколения поддержки параллелизма в Microsoft® .NET Framework.

Это охватывает:

  • От LINQ к PLINQ
  • Модель программирования PLINQ
  • Обработка вывода запроса
  • Параллельные исключения
  • Порядок в результатах вывода
  • Побочные эффекты
  • Внедрение PLINQ в работу

Параллельный LINQ (PLINQ)

person Willem    schedule 12.08.2012
comment
я полностью согласен с тем, что PLINQ — хорошее начало, но вопрос в том, что если у меня есть 2 потока, которые обрабатывают список объектов (сразу после десериализации — обратите внимание, что буфер продолжает поступать, и эти сообщения продолжают плавать в моей системе) с некоторым свойством (это идентификатор свойство), и теперь мне нужно разделить его (по идентификаторам) и перенаправить в поток (используя параллельный метод) в моем приложении. как я могу гарантировать, что каждый элемент с тем же идентификатором будет отправлен в поток, который не требует блокировки? - person Tzahi; 12.08.2012
comment
@Tzahi Похоже, вам нужно взглянуть на ConcurrentQueue. В качестве альтернативы, если входящие объекты действительно выполняются одновременно с обработкой (и потенциально никогда не заканчиваются), то, возможно, Реактивные расширения. - person Richard; 12.08.2012
comment
concurrentQueue недостаточно хорош, так как это возвращает меня к текущему решению, которое у меня есть, где все ставится в очередь, а поток обрабатывает все данные. это вызывает узкие места в моих системах и, с другой стороны, очень низкую загрузку ЦП. Я проверяю решение реактивных расширений - оно выглядит многообещающе... держите вас в курсе очень скоро. - person Tzahi; 12.08.2012
comment
Расширения реакции на самом деле очень интересны, мне кажется, это решение. спасибо Ричард! - person Tzahi; 12.08.2012