这会阻止事件循环吗?

时间:2013-05-25 01:37:08

标签: ruby activerecord sinatra eventmachine

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

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

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

Model.create(.....)阻止事件循环(瘦内部使用eventmachine)?如果是这样,这有多糟糕,有什么选择?

由于

2 个答案:

答案 0 :(得分:0)

我的理解是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对我来说太沉重了。

答案 1 :(得分:0)

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