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

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

Спасибо

2 ответа

Решение

Предполагая, что вы используете 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, имеют реальные потоки и могут запускать несколько потоков параллельно.

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

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

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

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

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

Другие вопросы по тегам