我有一个使用sinatra
作为其网络服务器的thin
应用。我通过ActiveRecord
与我的数据库进行互动。
如果在端点中,我这样做:
get '/test' do
Model.create(.....)
end
Model.create(.....)
阻止事件循环(瘦内部使用eventmachine
)?如果是这样,这有多糟糕,有什么选择?
由于
答案 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