Я пытаюсь сохранить что-то в своей базе данных через ActiveRecord, используя Thread.pool ruby-thread в задании Sidekiq. Странно, что код отлично работает при выполнении его вручную в моей консоли Rails, но он зависает без каких-либо ошибок, когда он запускается в Sidekiq.Использование ruby-thread, sidekiq и сохранение с помощью ActiveRecord с помощью 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