gpt4 book ai didi

ruby-on-rails - 使用ruby-thread,sidekiq,并使用Thread.pool与ActiveRecord保存

转载 作者:行者123 更新时间:2023-12-03 13:03:45 25 4
gpt4 key购买 nike

我正在尝试在Sidekiq作业中使用ruby-thread的Thread.pool通过ActiveRecord将某些内容保存到数据库中。奇怪的是,当在我的Rails控制台中手动执行代码时,代码可以正常工作,但是在Sidekiq中运行时,它挂起时没有任何错误。

这是我正在做的一个例子:

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并一次运行一个作业,它也可以工作(但那当然不是我想要做的事情-我需要作业可以同时运行)。

有谁知道为什么使用 ResultTable保存到 thread/pool时,Sidekiq作业会挂起?我正在使用最新版本的Sidekiq,Ruby 4.2.0和Rails 5.0.1。

最佳答案

弄清楚这是由开发环境中的死锁引起的,这解释了为什么它在rails控制台中起作用但不在我的rails应用程序的dev环境中起作用。似乎特定于Rails5。解释了here

关于ruby-on-rails - 使用ruby-thread,sidekiq,并使用Thread.pool与ActiveRecord保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com