我試圖在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。
你什麼樣的錯誤,那也許是因爲你用完數據庫連接的? – user2959701
@ user2959701:正如OP所說,沒有錯誤。 Sidekiq作業中的每個線程都會在調用「ResultTable.new」時停滯不前,這是'ActiveRecord'的一個新實例。看起來應用程序不在數據庫連接之中,因爲代碼在控制檯中工作,而不是作爲Sidekiq工作。 – Deltik