2017-02-10 11 views
1

Я пытаюсь сохранить что-то в своей базе данных через 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.

+0

Какую ошибку вы получаете, может быть, у вас закончились соединения с базой данных? – user2959701

+0

@ user2959701: Как сказал OP, нет ошибки. Каждый поток в работе Sidekiq просто застревает при вызове 'ResultTable.new', который является новым экземпляром' ActiveRecord'. Похоже, что приложение не подключено к базе данных, потому что код работает в консоли, но не как работа Sidekiq. – Deltik

ответ

0

Выяснено, что это было вызвано тупиком в среде dev, что объясняет, почему он работал в консоли rails, но не в среде Dev моего приложения rails. Похоже, что это относится к Rails 5. Объяснено here.