Зачем использовать потоки в Ruby Event Machine? - PullRequest
4 голосов
/ 08 февраля 2012

Поскольку машина событий называется библиотекой асинхронного ввода-вывода модели событий (например, node.js), которая является однопоточной и использует цикл обработки событий для обработки одновременных запросов, действительно ли необходимо заботиться о потоке и использовать егокод уровня приложения ruby ​​(т. е. контроллер rails при обработке запросов)?

Я больше привык к модели node.js, где вы на самом деле просто оборачиваете свой код внутри обратного вызова, а затем все за вас позаботится,(системный вызов select () для kqueue, epoll и т. д., который порождает новые потоки, обрабатывается в реализации C ++ более низкого уровня), а также, ECMAscript по своей природе в любом случае не имеет потоков.

Недавно я видел эту частькода ruby ​​при попытке узнать о Event Machine:

Thread = Thread.current
Thread.new{ 
   EM.run{ thread.wakeup }
}
# pause until reactor starts
Thread.stop

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

Я знаю, что в ruby ​​есть потоки, встроенные в язык (зеленые потоки MRI, потоки JRuby JVM), поэтому может возникнуть соблазн использовать потоки?Тем не менее, с моей точки зрения, это несколько отрицательно сказывается на цели, если на самом деле вы не должны беспокоиться о них в коде приложения более высокого уровня, поскольку для решения этой проблемы в значительной степени введена модель, основанная на событиях.

Благодарю.ценим любые ответы / разъяснения.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

При использовании EventMachine у ​​вас не может быть задачи с интенсивным использованием процессора, потому что время, которое вы тратите на свою задачу, «отнимается» из реактора, я использую потоки, когда знаю, что задача собирается:

  • блокировать (вы никогда не должны блокировать поток событийной машины)
  • использовать больше процессоров, чем мои средние задачи

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

Другой выбор - использовать волокна, которые являются еще одним другим зверем.

1 голос
/ 08 февраля 2012

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

...