2017-02-10 35 views
1

我試圖在Sidekiq作業中使用的紅寶石線程的Thread.pool以節省通過ActiveRecord的東西,我的數據庫與ActiveRecord的節約。奇怪的是,在我的Rails控制檯手動執行時,它的代碼工作正常,但它掛起,沒有任何錯誤,當它在Sidekiq運行。使用Ruby線程,sidekiq,並使用Thread.pool

下面是我在做什麼的例子:

require 'thread/pool' 

@array_job = ["first", "second", "third", "forth"] 

def do_this(something) 
    ... 
    #do stuff 
    ... 
    @result = {key1: value1, key2: value2, key3: value3} 
end 

def save_result 
    save_this = ResultTable.new 
    save_this.column1 = @result[key1] 
    save_this.column2 = @result[key2] 
    save_this.column3 = @result[key3] 
    save_this.save 
end 

pool = Thread.pool(8) 

@array_job.each_with_index do |something| 
    pool.process do 
    do_this(something) 
    save_result 
    end 
end 

pool.shutdown 

的想法是,我想在@array_job執行一切同時,一旦執行完畢,我要保存結果到數據庫表。我不希望結果保存到一個數組,以便陣列上再打將它們保存到一個表 - 我想在表後do_this(something)已爲每個作業執行保存到立即發生。

當我在Sidekiq中運行時,Sidekiq作業將無限期地掛在save_this = ResultTable.new上,並且直到我殺死Sidekiq實例本身時纔會恢復。如前所述,如果我在rails控制檯中手動運行,它可以正常工作。如果我刪除pool.process do和運行在同一時間每個作業一個它也可以(但當然不是我想做的事 - 我需要的作業同時運行)。

有誰知道爲什麼Sidekiq工作會掛起,當它保存到ResultTable使用thread/pool?我使用的是最新版本的Sidekiq,Ruby 4.2.0和Rails 5.0.1。

+0

你什麼樣的錯誤,那也許是因爲你用完數據庫連接的? – user2959701

+0

@ user2959701:正如OP所說,沒有錯誤。 Sidekiq作業中的每個線程都會在調用「ResultTable.new」時停滯不前,這是'ActiveRecord'的一個新實例。看起來應用程序不在數據庫連接之中,因爲代碼在控制檯中工作,而不是作爲Sidekiq工作。 – Deltik

回答

0

想通了,這是通過在開發環境僵局,這也是爲什麼它在軌工作控制檯,但不是我的Rails應用程序的開發環境中引起的。看起來是針對Rails 5的。它的解釋是here