блок рубиновой нити? - PullRequest
       54

блок рубиновой нити?

2 голосов
/ 08 января 2012

Я где-то читал, что рубиновые потоки / волокно блокируют IO даже с 1.9. Это правда и что это на самом деле означает? Если я выполняю некоторые операции с сетью / http в нескольких потоках, будет ли запущен только один поток в указанное время для этого запроса?

спасибо

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Если вы используете CRuby, одновременно будет работать только один поток. Однако запросы будут выполняться параллельно, поскольку каждый поток будет заблокирован на своем IO, пока его IO не завершен. Так что если вы делаете что-то вроде этого:

require 'open-uri'
threads = 10.times.map do
  Thread.new do
    open('http://example.com').read.length
  end
end

threads.map &:join
puts threads.map &:value

это будет намного быстрее, чем последовательно.

Кроме того, вы можете проверить, завершен ли поток без блокировки на его завершении.

Например:

require 'open-uri'
thread = Thread.new do
  sleep 10
  open('http://example.com').read.length
end
puts 'still running' until thread.join(5)
puts thread.value

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

Несколько хороших ссылок:

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

Все потоки выполняются одновременно, но ввод-вывод будет заблокирован до тех пор, пока все они не завершатся.

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

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

Если вы хотите, чтобы фоновые процессы извлекали delayed_job

...