0

我正在Sinatra为我的 API 使用 gem。我想要做的是在收到请求时处理它,返回响应并开始新的长时间运行的任务。

我是 Ruby 的新手,我读过关于 Threading 的文章,但不确定完成任务的最佳方法是什么。

这是我的sinatra终点

  post '/items' do
     # Processing data
     # Return response (body ...)
     # Start long running task
  end

我将不胜感激任何建议或示例。

4

2 回答 2

1

我相信更好的方法是使用后台作业。当您的工作人员执行一些长时间运行的任务时,它对新请求不可用。使用后台作业 - 他们完成工作,而您的网络工作者可以处理新请求。

您可以以 ruby​​ 为起点查看最流行的背景工作宝石:resque、、、delayed_jobssidekiq

UPD:实现取决于选择的 gem,但一般方案如下:

# Controller
post '/items' do
  # Processing data
  MyAwesomeJob.enqueue # here you put your job into queue
  head :ok # or whatever
end

MyAwesomejob您实施长期运行的任务时

接下来,关于 Mongoid 和后台作业。你永远不应该使用复杂的对象作为工作参数。我不知道您正在执行什么样的任务,但有一个普遍的答案 - 使用简单的对象。

例如,不要使用您的User作为参数,而是使用user_id然后在您的工作中找到它。如果您这样做,您可以毫无问题地使用任何数据库。

于 2016-12-26T06:49:30.087 回答
0

同意unkmas。

有两种方法可以做到这一点。线程或像 sidekiq 这样的后台工作宝石。

如果处理时间不那么长并且您不想为工作人员编写代码,那么线程是非常好的。但是,如果您不使用线程池或者您期望突发的 http 流量,则很有可能会运行过多的线程。

最好的方法是使用 sidekiq 或类似的东西。你甚至可以有一个像 beanstalkd 这样的作业队列,然后将作业排入队列并返回响应。您可以让工作人员从队列中读取并稍后处理它。

于 2017-01-17T05:50:55.030 回答