加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在Ruby on Rails中发送响应之前等待多个异

发布时间:2020-12-17 03:42:40 所属栏目:百科 来源:网络整理
导读:在 Ruby on Rails中,我意识到它本质上是同步的,并且开发人员可以异步地执行同步事务.在我做的一些Web开发中,我开始有多个操作,比如对外部API的GET请求,我希望它们同时启动,因为一个不依赖于另一个的结果.我发现 concurrent-ruby library似乎运作良好.通过将
在 Ruby on Rails中,我意识到它本质上是同步的,并且开发人员可以异步地执行同步事务.在我做的一些Web开发中,我开始有多个操作,比如对外部API的GET请求,我希望它们同时启动,因为一个不依赖于另一个的结果.我发现 concurrent-ruby library似乎运作良好.通过将它混合到您创建的类中,类的方法具有在后台线程上运行的异步版本.这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编码的类,我在其中混合了Concurrent :: Async模块,并编写了一个名为“work”的方法,它发送了一个HTTP请求:

def index
  op1_result = FirstAsyncWorker.new.async.work
  op2_result = SecondAsyncWorker.new.async.work

  render text: results(op1_result,op2_result)
end

但是,控制器将在操作方法执行结束时隐式呈现响应.因此,响应在op1_result和op2_result获取值之前发送,并且发送到浏览器的唯一内容是“#”.

到目前为止,我的解决方案是使用Ruby线程.我写的代码如下:

def index
  op1_result = nil
  op2_result = nil

  op1 = Thread.new do
    op1_result = get_request_without_concurrent
  end

  op2 = Thread.new do
    op2_result = get_request_without_concurrent
  end

  # Wait for the two operations to finish
  op1.join
  op2.join

  render text: results(op1_result,op2_result)
end

我不使用互斥锁,因为两个线程不访问相同的内存.但我想知道这是否是最佳方法.有没有更好的方法来使用concurrent-ruby库或其他更适合这种情况的库?

解决方法

经过对并发ruby库的更多研究后,我最终回答了自己的问题. “未来”最终成为我追求的目标!简单地说,它们在后台线程中执行一段代码,并尝试访问Future的计算值阻塞主线程,直到后台线程完成其工作.我的Rails控制器操作最终看起来像:

def index
  op1 = Concurrent::Future.execute { get_request }
  op2 = Concurrent::Future.execute { another_request }

  render text: "The result is #{result(op1.value,op2.value)}."
end

带有“render”的行阻塞,直到两个异步任务完成,此时“result”可以开始运行.

如果有人正在进行这种编程,发现这一点,并希望看到实现这两种异步技术的Rails应用程序的示例,我已经托管了public example.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读