【问题标题】:Ruby threading/forking with API (Sinatra)使用 API 的 Ruby 线程/分叉 (Sinatra)
【发布时间】:2016-12-26 06:32:02
【问题描述】:

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

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

这里是我的sinatra 端点

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

如果您有任何建议或示例,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

    您可以以 ruby​​ 为起点查看最流行的背景工作宝石:resquedelayed_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,然后在您的工作中找到它。如果你会这样做,你可以毫无问题地使用任何数据库。

    【讨论】:

    • 感谢您的回答,您能否举例说明我的情况如何,我的意思是返回响应而不是添加后台作业,反之亦然?谢谢
    • 还有一件事,我正在使用 Mongoid 来保存对象,我该如何使用它或将对象传递给 Sidekiq?
    【解决方案2】:

    同意 unkmas。

    有两种方法可以做到这一点。 线程或后台作业 gem,例如 sidekiq。

    如果处理时间不那么长并且您不想为工作线程编写代码,那么线程是完全可以的。但是,如果您不使用线程池,或者您预计会出现突发的 http 流量,则很有可能会运行过多的线程。

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

    【讨论】:

      猜你喜欢
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 2023-03-19
      • 1970-01-01
      • 2011-04-20
      • 2012-01-21
      • 2015-01-13
      相关资源
      最近更新 更多