3 Stimmen

Schienen: Ist es möglich, einige Dinge in einem Thread zu initialisieren?

In einem der meine Initialisierer muss ich einige Hashes aus einer Redis-Instanz abrufen. Aufgrund der Anzahl der Hashes und der Verbindungsschwächen kann das Laden jedoch ziemlich lange dauern. Da es im Initialisierer ist, ist die Anwendung nicht verfügbar, bis die Hashes alle geladen wurden.

Daher dachte ich, ich könnte die Initialisierung in einem Thread durchführen, so dass die Anwendung starten kann und dann die Hashes auf ihre auf Zeit geladen werden würde, wie Sie nicht wesentlich für die Anwendung sind.

Ich habe etwas Ähnliches versucht:

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

Aber es funktioniert nicht und es gibt keine Fehlermeldungen :(

Irgendwelche Ideen?

Alex

0voto

jdc Punkte 1235

Könnten Sie das bitte etwas näher erläutern?

  • Was ist das Ziel? Was machen Sie mit dem Inhalt der Hashes?
  • Welchen Stack verwenden Sie?

Ich versuchte einen einfachen Test gegen Rails 3.0.5/WEBrick auf meinem lokalen Rechner (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

Und es hat so funktioniert, wie ich es erwartet hatte:

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X