gpt4 book ai didi

ruby-on-rails - 使用 Resque/Rails 保存工作结果

转载 作者:可可西里 更新时间:2023-11-01 11:21:43 25 4
gpt4 key购买 nike

在我的 Rails 应用程序中,我试图接受我的工作 API 调用并让它们由后台工作人员处理。

我在 app/jobs/api_request_job.rb 中有以下内容:

class ApiRequestJob
def self.perform(params)
Query.new(params).start
end
end

Query 类是执行 HTTParty 请求的地方(有许多方法用于不同的查询类型,具有与 parks 方法相同的基本格式:

require 'ostruct'

class Query
include FourSquare

attr_reader :results,
:first_address,
:second_address,
:queries,
:radius

def initialize(params)
@results = OpenStruct.new
@queries = params["query"]
@first_address = params["first_address"]
@second_address = params["second_address"]
@radius = params["radius"].to_f
end

def start
queries.keys.each do |query|
results[query] = self.send(query)
end
results
end

def parks
category_id = "4bf58dd8d48988d163941735"
first_address_results = FourSquare.send_request(@first_address, radius_to_meters, category_id)["response"]["venues"]
second_address_results = FourSquare.send_request(@second_address, radius_to_meters, category_id)["response"]["venues"]
response = [first_address_results, second_address_results]
end

最后, Controller 。在尝试将此操作分配给后台工作人员之前,此行工作正常:@results = Query.new(params).start

class ComparisonsController < ApplicationController
attr_reader :first_address, :second_address

def new
end

def show
@first_address = Address.new(params["first_address"])
@second_address = Address.new(params["second_address"])
if @first_address.invalid?
flash[:notice] = @first_address.errors.full_messages
redirect_to :back
elsif Query.new(params).queries.nil?
flash[:notice] = "You must choose at least one criteria for your comparison."
redirect_to comparisons_new_path(request.params)
else
@queries = params["query"].keys
@results = Resque.enqueue(ApiRequestJob, params) # <-- this is where I'm stuck
end
end

end

我正在运行 redis,安装了 resque,并且正在运行任务/启动工作人员。 @results 返回的当前值是 true 而不是我需要取回的结果的散列。有没有办法让 Resque 作业的结果持久化并返回数据而不是 true?关于如何让后台工作人员返回我的常规 API 调用返回的相同类型的数据,我缺少什么?

非常感谢!

最佳答案

您收到的 true 表示作业已成功排入队列。 worker 将拾取它并在后台异步运行它,这意味着,与将它排入队列的线程不同时运行。因此无法从作业中检索返回值。

如果您需要该进程的值,则必须在没有 worker 的情况下从 Controller 运行它。此外,仅仅将工作推给另一个进程也不会获得任何好处,因为 Web 进程必须等待响应才能继续运行。

如果您立即需要该返回值并且出于性能原因这样做,那么您可以研究其他形式的并发,例如使用另一个 thread执行请求,然后仅在需要时在 View 中获取结果,例如:

class AsyncValue
def initialize(&block)
@thr = Thread.new(&block)
end

def value
@thr.join
end
end

在 Controller 上

@results = AsyncValue.new { Query.new(params).start  }

在 View 上

<%= @results.value.each .... %>

但您仍然需要解决错误处理问题,这可能会变得非常复杂,但这是可行的。

就我个人而言,我会直接提出请求,但您比我更了解您的领域。

关于ruby-on-rails - 使用 Resque/Rails 保存工作结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27241021/

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