Может ли параллелизм улучшить производительность? - PullRequest
3 голосов
/ 13 февраля 2012

Я понимаю, что в Ruby, работающем на YARV, потоки означают параллелизм, а не параллелизм. Мой вопрос: в каких ситуациях только параллелизм может улучшить производительность? Например, я могу представить, что параллелизм повысит производительность при одновременной работе с несколькими потоками ввода-вывода - если одна задача медленная, это не означает, что все последующие задачи в стеке должны ждать завершения этой задачи. Я прав? Есть ли другие подобные случаи? Стоит ли соотношение [hopes that YARV will ever remove the GIL]/[overhead of creating threads with the GIL] начинать использовать потоки в Ruby в настоящий момент?

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

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

  1. ожидаете долгое время, пока какое-то отдельное событие завершится, в то время как другие уже закончили и ждут, чтобы вы посмотрели на них, или
  2. Потеря мощности ЦП за счет сотен различных событий, которые не сработали, при поиске событий, которые действительно сработали.

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

Надеюсь, это поможет!

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

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

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

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