WedX - журнал о программировании и компьютерных науках

Как я могу разветвлять несколько раз, запускать асинхронно и обрабатывать все результаты одновременно?

У меня есть следующий код:

data_set = [1,2,3,4,5,6]

results  = []

data_set.each do |ds|
  puts "Before fork #{ds}"
  r,w = IO.pipe
  if pid = Process.fork
    w.close
    child_result = r.read
    results << child_result
  else
    puts "Child worker for #{ds}"
    sleep(ds * 5)
    r.close
    w.write(ds * 2)
    exit
  end
end

Process.waitall
puts "Ended everything #{results}"

По сути, я хочу, чтобы каждый ребенок выполнял некоторую работу, а затем передал результат родителю. Мой код теперь не работает параллельно, и я не знаю, в чем именно заключается моя проблема, возможно, это потому, что я читаю в родительском коде, но я не уверен. Что мне нужно сделать, чтобы заставить его работать асинхронно?

РЕДАКТИРОВАТЬ: я изменил код на этот, и, похоже, он работает нормально. Есть ли проблема, которую я не вижу?

data_set = [1,2,3,4,5,6]

child_pipes = []
results     = []

data_set.each do |ds|
  puts "Before fork #{ds}"
  r,w = IO.pipe
  if pid = Process.fork
    w.close
    child_pipes << r
  else
    puts "Child worker for #{ds}"
    sleep(ds * 5)
    r.close
    w.write(ds * 2)
    exit
  end
end

Process.waitall
puts child_pipes.map(&:read)
20.01.2013

  • как насчет github.com/bruceadams/pmap? 20.01.2013
  • Вам действительно нужно запускать каждый набор данных в разных процессах? Это может быть намного чище, используя потоки. 20.01.2013
  • Я знаю, что это может быть чище, используя потоки. Это только с теоретической точки зрения. 21.01.2013
  • @nbarraille, если работа ребенка не является в основном вводом-выводом, потоки не помогут параллелизму, если только они не работают на rbx или jruby. MRI GIL делает рубиновые потоки бесполезными для параллелизма вычислений. 21.01.2013

Ответы:


1

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

Другие решили эти проблемы повторно используемыми способами, вы можете попробовать parallel gem, чтобы не писать кучу ненужных код.

21.01.2013
Новые материалы

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


Для любых предложений по сайту: [email protected]