gpt4 book ai didi

ruby-on-rails - 在我的 Rails Controller 方法中运行线程

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:28 25 4
gpt4 key购买 nike

我有一组数据,我想在我的 Rails 应用程序中对其进行一些计算,每个计算都是相互独立的,所以我想对它们进行线程化,以便我的响应更快。

这是我的 ATM:

def show

@stats = Stats.new

Thread.new {
@stats.top_brands = #RESULT OF FIRST CALCULATION
}

Thread.new {
@stats.top_retailers = #RESULT OF SECOND CALCULATION
}

Thread.new {
@stats.top_styles = #RESULT OF THIRD CALCULATION
}

Thread.new {
@stats.top_colors = #RESULT OF FOURTH CALCULATION
}

render json: @stats
end

现在这将为 @stats 的每个成员实例返回一堆空数组,但是,如果我将线程连接在一起,它会运行,但会破坏线程化的目的,因为每个线程阻塞。

由于我对线程非常陌生,我想知道我在这里做错了什么,或者它是否有可能完成我正在尝试做的事情,也就是说,并行运行 4 次计算并将结果返回给客户。

谢谢,

最佳答案

首先取决于您的计算是在执行处理器繁重的操作,还是在执行大量阻塞 IO,例如从数据库、文件系统或网络读取数据。如果他们执行前者,那不会有太大好处,因为每个线程都占用 CPU 时间并且无法调度其他线程——更糟糕的是,即使您使用的是具有 Global Interpreter Lock 的 Ruby MRI。 .但是,如果线程正在执行阻塞 IO,它们至少可以等待,让另一个线程运行,等待,让另一个线程运行等等,直到它们全部返回。

最后,您必须将所有线程连接在一起,因为您需要它们的返回值。在所有 Thread.new 调用下方执行此操作。将每个 Thread.new 的返回值保存到一个数组中:

threads = []
threads << Thread.new ...

然后在渲染之前将它们连接在一起:

threads.each &:join

如果您想真正确定这对您有帮助,只需对整个操作进行基准测试即可:

def show
start_time = Time.now.to_f
@stats = Stats.new

Thread.new {
@stats.top_brands = #RESULT OF FIRST CALCULATION
}
Thread.new {
@stats.top_colors = #RESULT OF FOURTH CALCULATION
}

@elapsed_time = Time.now.to_f - start_time
# do something with @elapsed_time, like putsing it or rendering it in your response

render json: @stats
end

希望对您有所帮助。

关于ruby-on-rails - 在我的 Rails Controller 方法中运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20059334/

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