Блок рубиновой нити?
Я где-то читал, что рубиновые потоки / волокно блокируют 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