2009-10-21 36 views
7

我有一個Rails應用程序,其中少量的動作需要大量的計算時間。我沒有經歷將這些操作作爲後臺任務的複雜性,而是發現我可以將處理分割成多個線程,並且通過使用帶有多核服務器的JRuby,我可以確保所有線程在合理的時間內完成。 (客戶已表示強烈關注在後臺保留此方法與運行任務。)在Rails應用程序中記錄線程

問題是寫入Rails日誌記錄程序在這些線程中不起作用。在日誌文件中什麼都沒有顯示。我發現這個問題的一些參考,但沒有解決方案。我不介意在我的代碼中插入puts來幫助調試,但stdout似乎被glassfish gem應用服務器所吞噬。

有沒有人成功地完成日誌裏面的Rails ruby​​線程而不會每次創建一個新的日誌?

+0

更新:我發現放入線程顯示在glassfish日誌文件中。我不確定爲什麼我以前沒有看到這個;我可能最初在另一個(非主)線程產生的線程中測試它。無論如何,出於調試目的,我看到在日誌文件中寫入STDOUT,所以我很高興。 – 2009-10-26 02:29:21

回答

4

我正在用同樣的問題撓我的腦袋。對我來說,答案如下:

Thread.new do 
    begin 
    ... 
    ensure 
    Rails.logger.flush 
    end 
end 
+0

看起來不錯!謝謝! – 2010-08-22 01:33:50

+0

不適用於我,使用EM – skrat 2010-11-14 16:33:08

0

我理解你對後臺任務的擔憂,但請記住,在Rails中脫離線程可能是一件可怕的事情。該框架幾乎沒有多線程的規定,這意味着您必須將所有Rails對象視爲不是線程安全的。即使數據庫連接也變得棘手。

至於記錄器:標準的Ruby記錄器類應該是線程安全的。但即使Rails使用它,你也無法控制Rails應用程序正在做什麼。例如,基準測試機制將通過切換級別來「記錄」記錄器。

我會避免使用導軌記錄器。如果您想使用這些線程,請在線程內創建一個記錄該操作消息的新記錄器。如果您不想爲每個線程創建新的日誌,還可以嘗試在運行時中爲每個線程都可以訪問的內容創建一個線程安全的日誌記錄對象。

在你的地方,我可能會再看看後臺的工作解決方案。雖然DRb看起來像一場噩夢,但「bj」看起來不錯而且容易;儘管它需要一些工作才能使它與JRuby一起運行。另外還有一個選擇是從JRuby使用Java調度程序,請參閱http://www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails

+0

感謝您的信息和建議,但在這一點上,我會堅持使用線程方法,因爲除了日誌記錄以外它工作正常。我沒有在任何線程中使用任何可疑的寶石/插件,並且我非常小心使用互斥鎖來防止競爭條件。 我對使用Rails日誌記錄器的興趣只是簡單的調試,我設法解決了這個問題,只有在JRUBY_VERSION被定義的情況下才使用線程,否則就按順序運行相同的代碼。不管怎麼說,還是要謝謝你! – 2009-10-24 04:41:30