C #: ферма заданий для рабочих процессов на многопроцессорной машине - PullRequest
2 голосов
/ 15 июня 2010

У меня есть общая проверка, которая должна быть выполнена на ок. 1000 предметов. Проверка занимает около 3 секунд. У нас есть сервер с 4 процессорами (и в нашей сети также есть другие многопроцессорные серверы), поэтому мы хотели бы создать exe / dll для проверки и вернуть результаты «хозяину».

Кто-нибудь знает структуру для этого или как можно это сделать в C #?

В частности:

  • Каков наилучший способ передачи данных между мастером и рабочим процессом?
  • Как мастер обеспечит, чтобы всегда выполнялись 4 процесса одновременно, и как только рабочий процесс завершится, запустите новый.
  • Как зарегистрировать, что работник закончил, и добавить его результаты в список?

Надеюсь, это достаточно ясно, но с удовольствием уточню.
A.

Некоторые уточнения
* Между вызовом и возвратом процесса фактически нет межпроцессного взаимодействия, например,

     ResultObject = WorkerProcess(HeresYourDataSonDoSomethingWithIt);
* Первоначально одна машина является обязательной, но если подумать дальше, у нас, вероятно, будут случаи, когда у нас есть 6000 объектов для проверки, и мы хотели бы использовать их на нескольких серверах, поэтому мы хотели бы сделать правильный выбор дизайна из начало, или, по крайней мере, не разрабатывать решение для одного сервера, которое должно быть полностью переписано для нескольких. Спасибо!

Ответы [ 4 ]

3 голосов
/ 15 июня 2010

Лучший способ передачи данных между процессами в C # - использование удаленного взаимодействия .NET.Поскольку машины находятся в одной сети, вы можете использовать двоичную сериализацию и каналы IPC, которые должны быть очень быстрыми.Вам не нужно 4 процесса на сервере, просто несколько потоков.При использовании .NET 4.0 проверьте параллельные расширения , и это может значительно упростить ваш код, если вы не знакомы с многопоточностью и подводными камнями, которые с ней связаны.Вероятно, это излишне для ваших нужд, но вы можете посмотреть на DryadLINQ из Microsoft Research Labs.

2 голосов
/ 15 июня 2010

Если вы должны использовать отдельные процессы, вы можете рассмотреть возможность определения всех задач и помещения их в очередь .MSMQ и SQL Server - это два варианта.

Затем пусть каждый процесс извлекает задачу из очереди до тех пор, пока очередь не станет пустой.

С четырьмя процессорами вы можете просто ускорить четыре процесса опроса и датькаждая привязка к конкретному процессору.

1 голос
/ 15 июня 2010

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

Избегайте фиксации архитектуры, которая значительно усложняет код, но может никогда не использоваться. Это будет намного легче сделать, когда вы используете потоки. Это может масштабироваться в долгосрочной перспективе, будущее за многоядерными процессорами.

В противном случае WCF - это правильная технология.

1 голос
/ 15 июня 2010

Взгляните на встроенный ThreadPool. Вы можете поставить в очередь «рабочий элемент» для пула потоков. .NET будет управлять потоками, запускать новые потоки по мере необходимости и следить за тем, чтобы «свободные» потоки начинали новую работу. Кроме того, работа должна быть равномерно распределена между процессорами по пулу потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...