【问题标题】:Does this block the event loop?这会阻止事件循环吗?
【发布时间】:2013-05-25 01:37:07
【问题描述】:

我有一个sinatra 应用程序,它使用thin 作为它的网络服务器。我通过ActiveRecord 与我的数据库进行交互。

如果在端点中,我会这样做:

get '/test' do
  Model.create(.....)
end

Model.create(.....) 是否阻塞了事件循环(内部使用 eventmachine)?如果是这样,这有多糟糕,还有哪些替代方案?

谢谢

【问题讨论】:

  • 所有操作“阻塞”一个线程,直到它们完成。如果 eventmachine 线程(它只使用一个)调用请求方法,那么它将阻塞直到方法完成。

标签: ruby activerecord sinatra eventmachine


【解决方案1】:

我的理解是 thin 默认是线程化的,除非你禁用它。因此,您的请求处理程序可以使用 Eventmachine::Defer 异步执行。

是的,正如@user2246674 的评论所说,如果您的处理程序在反应器线程中执行,那么它将阻塞所有内容。

至于替代方案,我刚刚在 Google 上搜索了ActiveRecord and Eventmachine,第一个点击是带有一些代码的帖子:http://www.mikeperham.com/2010/03/30/using-activerecord-with-eventmachine/。您可能会发现查看支持 ActiveRecord 的“em-synchrony”:https://github.com/igrigorik/em-synchrony 很有用。

这也是我自己关于相关主题的问题:async requests using sinatra streaming API 我使用 Sinatra 的流 API 来实现异步请求处理。

我个人会使用我的 Sinatra 应用程序中的直接数据库访问。这就是我一直在做的事情。 ActiveRecord 对我来说太重了。

【讨论】:

  • 感谢您的详细回复。直接访问数据库是什么意思?您的意思是使用 mysql2 gem 并传入原始查询?
  • 这是一篇关于EM.Defer的帖子:stackoverflow.com/questions/10881594/…
【解决方案2】:

是的,它确实会阻塞。如果您在 Mysql 上,您可以使用 mysql2 gem 发出请求,它支持异步请求。 https://github.com/brianmario/mysql2

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 2019-01-06
    • 2020-08-05
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多