使用API​​(Sinatra)进行Ruby线程/分叉

时间:2016-12-26 06:32:02

标签: ruby multithreading parallel-processing sinatra ruby-thread

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

我是Ruby的新手,我读过有关线程但不确定完成任务的最佳方法是什么。

这是我的sinatra端点

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

我会感激任何建议或例子。

2 个答案:

答案 0 :(得分:1)

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

您可以查看最常用的红宝石背景作业宝石作为起点:resquedelayed_jobssidekiq

UPD:实施取决于所选的宝石,但一般方案将是这样的:

# 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然后在工作中找到它。如果您这样做,您可以毫无问题地使用任何数据库。

答案 1 :(得分:0)

同意unkmas。

有两种方法可以做到这一点。 线程或背景工作宝石像sidekiq。

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

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