2015-03-09 5 views
2

Мне нужно преобразовать тысячи офисных документов MS в разных форматах в один общий формат. Чтобы ускорить работу, я бы распараллеливал ее с помощью akka.net. WordSaveAsActor должен:Актеры Akka.net в STA

  • работать в однопоточной Квартире
  • держать экземпляр Слова Application
  • сделать COM вызовов на этом примере, как SaveAs (..) с путями из полученных сообщений из нескольких параллельных потоков
  • рестарт себя любой аварии

ли даже можно запустить akka.net актера в ГНА? Есть ли проблемы, если я использую akka.net таким образом?

+1

Слово не заботится о вашей библиотеке. Его интерфейс взаимодействия является однопоточным, любой вызов, который вы делаете из рабочего потока, автоматически привязывается к потоку, которому принадлежит объект Application. Это будет не быстрее, это будет * медленнее *. Вы могли бы в лучшем случае работать над * разными * документами у разных работников, каждый из которых владеет собственным Приложением. Это ускоряет масштабирование, Word - очень тяжелый процесс. –

+0

Вы не имеете в виду 10000 слов Примеры приложений? Почему это должно быть медленнее, если я просто отправлю пути?У меня странные эффекты и сбои даже при использовании async/wait вместо BackgroundWorker и поиска лучшего решения. –

ответ

3

Короткий ответ «да, вы можете сделать это с Akka.NET»

Как Hans отмечает в своем комментарии:

Слово не слишком заботится о вашей библиотеке. Его интерфейс взаимодействия является однопоточным, любой вызов, который вы делаете из рабочего потока, автоматически привязывается к потоку, которому принадлежит объект Application.

Вы можете использовать диспетчеров в Akka.NET для осуществления контроля над потребностями параллелизма ваших актеров - вы можете read about different types of Akka.NET dispatchers and how they work in our Akka.NET Bootcamp Lesson 2.1.

В вашем случае, вот что я рекомендую вам сделать:

  1. Создать свой WordSaveAsActor на резьбе STA и настроить его на использование CurrentSynchronizationContextDispatcher в Akka.NET, которые вы можете сделать с помощью конфигурации:

var wordActor = MyActorSystem.ActorOf(Props.Create(() => new WordSaveAsActor(...)).WithDispatcher("akka.actor.synchronized-dispatcher"))

Все сообщения этого актёра процессы будут сделаны автоматически на потоке STA. Мы используем эту технику в других средах STA, таких как пользовательский интерфейс Windows Forms, и это значительно упрощает все.

  1. Выполняйте всю работу, не требующую COM-компонента Word для других участников, использующих диспетчер по умолчанию (CLR threadpool.) Это может включать любую копию файла, открывать, перемещать и т. д. Когда вам нужно отправить данные или получить данные из слова, вы можете передать этим участникам сообщения на ваш WordSaveAsActor.

Как указывает Ханс, если вы не запускаете несколько экземпляров Word параллельно, вы не можете делать больше одной операции одновременно, используя свой COM API. Поэтому, чтобы воспользоваться параллелизмом Akka.NET, вам нужно найти способ использовать несколько участников для распараллеливания частей вашей операции, которые не требуют Word.

+0

Большое спасибо за подробное объяснение! Я наблюдаю за вашим активным прогрессом в github. Только завершено [Bootcamp] (http://petabridge.com/bootcamp/) Unit 1 теперь :) Портирование упражнений на F #, что делает их еще проще! Я запустил одного или двух словных актеров, которые все еще будут узким местом. Я предполагаю, что накладные расходы на передачу струн актерам намного дешевле, чем тяжелые операции с файловым доступом в фоновом режиме, не так ли? –

+0

Передача струн актерам очень дешева - наш тест PingPong может сделать что-то вроде 60 миллионов сообщений в секунду на 8-ядерной машине. – Aaronontheweb

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