Ruby threading/forking 和 API (Sinatra)
Ruby threading/forking with API (Sinatra)
我正在为我的 API 使用 Sinatra
gem。我想要做的是当收到请求时处理它,return 响应并开始新的长 运行 任务。
我是 Ruby 的新手,我已阅读有关线程的内容,但不确定完成任务的最佳方法是什么。
这是我的 sinatra
端点
post '/items' do
# Processing data
# Return response (body ...)
# Start long running task
end
如有任何建议或示例,我将不胜感激。
我认为更好的方法是使用后台作业。当您的 worker 执行一些 long-运行 任务时,它无法用于新请求。使用后台作业 - 他们完成工作,而您的网络工作者可以处理新请求。
您可以查看 ruby 最流行的背景工作 gem 作为起点:resque
、delayed_jobs
、sidekiq
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
然后在您的工作中找到它。如果你愿意这样做,你可以毫无问题地使用任何数据库。
同意 unkmas。
有两种方法可以做到这一点。
线程或后台作业 gem,例如 sidekiq。
如果处理时间不是那么长并且您不想为工作人员编写代码,则线程非常适合。但是,如果您不使用线程池或者您预计会有突发的 http 流量,您很可能 运行 启动了太多线程。
最好的方法是使用 sidekiq 或类似的东西。您甚至可以在中间有一个像 beanstalkd 这样的作业队列,en-queue 作业和 return 响应。您可以让工作人员从队列中读取并稍后处理。
我正在为我的 API 使用 Sinatra
gem。我想要做的是当收到请求时处理它,return 响应并开始新的长 运行 任务。
我是 Ruby 的新手,我已阅读有关线程的内容,但不确定完成任务的最佳方法是什么。
这是我的 sinatra
端点
post '/items' do
# Processing data
# Return response (body ...)
# Start long running task
end
如有任何建议或示例,我将不胜感激。
我认为更好的方法是使用后台作业。当您的 worker 执行一些 long-运行 任务时,它无法用于新请求。使用后台作业 - 他们完成工作,而您的网络工作者可以处理新请求。
您可以查看 ruby 最流行的背景工作 gem 作为起点:resque
、delayed_jobs
、sidekiq
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
然后在您的工作中找到它。如果你愿意这样做,你可以毫无问题地使用任何数据库。
同意 unkmas。
有两种方法可以做到这一点。 线程或后台作业 gem,例如 sidekiq。
如果处理时间不是那么长并且您不想为工作人员编写代码,则线程非常适合。但是,如果您不使用线程池或者您预计会有突发的 http 流量,您很可能 运行 启动了太多线程。
最好的方法是使用 sidekiq 或类似的东西。您甚至可以在中间有一个像 beanstalkd 这样的作业队列,en-queue 作业和 return 响应。您可以让工作人员从队列中读取并稍后处理。