我正在使用Sinatra
gem作为我的API。我想要做的是当收到请求时处理它,返回响应并启动新的长时间运行任务。
我是Ruby的新手,我读过有关线程但不确定完成任务的最佳方法是什么。
这是我的sinatra
端点
post '/items' do
# Processing data
# Return response (body ...)
# Start long running task
end
我会感激任何建议或例子。
答案 0 :(得分:1)
我认为更好的方法就是使用后台工作。当您的工作人员执行一些长时间运行的任务时,它不可用于新请求。使用后台作业 - 他们完成工作,而您的Web工作人员可以处理新请求。
您可以查看最常用的红宝石背景作业宝石作为起点:resque
,delayed_jobs
,sidekiq
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这样的作业队列,并将作业排入队列并返回响应。您可以让工作人员从队列中读取并稍后处理它。