Есть ли в Ruby какая-либо конструкция, аналогичная pmap Clojure для параллельной обработки? - PullRequest
0 голосов
/ 16 февраля 2011

Я пытаюсь решить, реализовать ли приложение в Ruby или Clojure. Два требования включают параллельную обработку:

  1. Приложение должно выполнять параллельные вызовы для получения XML-каналов и других типов данных через Интернет. Многие такие вызовы выполняются, и сериализация вызовов неэффективна.

  2. В идеале ответы на эти вызовы должны обрабатываться параллельно. Обработка, в основном, означает преобразование необработанного XML в гораздо меньший фрагмент структурированных данных (хэш Ruby или карту Clojure) и вставку их в базу данных MySQL или базу данных CouchDB.

Я знаю Ruby намного лучше, чем Clojure, но если это правильный проект для Clojure, я полностью его использую.

Функция Clojure pmap кажется идеальной для этих двух требований. Мне интересно, есть ли в какой-либо библиотеке или функции Ruby такой же простой и простой способ выполнения задач параллельной обработки, как указано выше.

Ответы [ 3 ]

2 голосов
/ 16 февраля 2011

Сделать функцию многократного использования pmap также просто:

module Enumerable
  def pmap
    map {|x| Thread.start {yield x}}.map {|t| t.join.value}
  end
end

Но, конечно, было бы неплохо использовать правильный пул / исполнитель потоков. Вот пример .

1 голос
/ 17 февраля 2011

Я думаю, что выбор языка реализации зависит от вашего приложения.

Если вы подключены к сети, Ruby должен работать нормально.Возможно, вам будет проще реализовать параллельные запросы, используя схему реактора с EventMachine .Вы можете отправлять HTTP-запросы, используя класс EventMachine :: Protocols :: HttpClient .

EventMachine.run {
   http = EventMachine::Protocols::HttpClient.request(
     :host => server,
     :port => 80,
     :request => "/index.xml"
   )
   http.callback {|response|
     # process response
   }
 }

Таким образом, вам не нужно беспокоиться о параллелизме и всех связанных с этим сложностях, но выбудет иметь высокую пропускную способность, так как вы можете делать большое количество одновременных запросов.

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

В случае с привязкой к ЦП я бы использовал Clojure, поскольку, если вы действительно привязаны к ЦП, выполнение обработки в Clojure будет проще выполнять параллельно и просто в любом случае быстрее.

1 голос
/ 16 февраля 2011

Вот простой маленький пример одного из способов сделать это. Обратите внимание, что ничто не ограничивает количество потоков, которые он создает одновременно, поэтому вы можете создать какой-то пул потоков, если у вас много потоков.

[1,2,3].map{|x| Thread.start{x+1}}.map{|t| t.join.value}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...