Rails: можно ли инициализировать некоторые вещи в потоке? - PullRequest
3 голосов
/ 23 марта 2011

В одном из моих инициализаторов мне нужно получить несколько хэшей из экземпляра redis. Однако из-за количества хэшей и слабых мест соединения загрузка может занять довольно много времени. Поскольку он находится в инициализаторе, приложение недоступно до тех пор, пока не будут загружены все хэши.

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

Я пробовал что-то вроде этого:

REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
STORE = {}
Thread.abort_on_exception = true
Thread.new do
  REDIS.keys.each do |key|
    STORE[key] = REDIS[key]
  end
end

Но это не работает и нет сообщений об ошибках: (

Есть идеи?

Alex

1 Ответ

0 голосов
/ 24 марта 2011

Пожалуйста, объясните немного больше?

  • Какова цель здесь? Что вы делаете с содержимым хэшей?
  • Какой стек вы используете?

Я попробовал простой тест на Rails 3.0.5 / WEBrick, работающий на моей локальной машине (OS X 10.6.7):

puts "I am in the main thread."
Thread.abort_on_exception = true
Thread.new do
  for i in 1..5
    puts "I am in a thread."
    sleep 2
  end
end
Thread.new do
  for i in 1..5
    puts "I am in another thread."
    sleep 1
  end
end

И это сработало так, как я ожидал:

ultramarine:ThreadTest jdc$ rails s
=> Booting WEBrick
=> Rails 3.0.5 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
I am in the main thread.
I am in a thread.
I am in another thread.
[2011-03-23 18:30:28] INFO  WEBrick 1.3.1
[2011-03-23 18:30:28] INFO  ruby 1.9.2 (2010-12-25) [x86_64-darwin10.5.0]
[2011-03-23 18:30:28] INFO  WEBrick::HTTPServer#start: pid=5802 port=3000
I am in another thread.
I am in a thread.
I am in another thread.
I am in another thread.
I am in a thread.
I am in another thread.
I am in a thread.
I am in a thread.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...