2013-03-19 115 views
0

Ruby on Rails是单线程应用程序吗?我觉得它不支持任何并发性,特别是当我在做mysql查询时。Ruby on Rails并发性

我正在使用ruby 1.8.7和rails 2.3.11以及Phusion Passenger(全部由Bluehost提供)。什么我使用此外,这是对我的开发服务器看起来像

[2013-03-19 10:42:00] INFO WEBrick 1.3.1 
[2013-03-19 10:42:00] INFO ruby 1.8.7 (2012-02-08) [universal-darwin12.0] 
[2013-03-19 10:42:00] INFO WEBrick::HTTPServer#start: pid=23034 port=3000 

以下情形严重,使我的应用程序无法使用:

步骤1:批量插入(大量的数据)< - 这得到当事务提交数据时卡住。

第2步:从不同的插入表中查询,获取JSON对象。

我可以告诉这是从控制台发生的。我试图增加“池”(我相信这会增加mysql并发连接),但它并没有提高我的性能。

回答

0

我相信它是默认的串行线程(一直处理一个请求,然后是另一个请求)。要启用多线程,请指定像您一样的池大小,然后在您的environment.rb类型文件中运行

config.threadsafe! 

我不认为这会影响你描述的场景,但听起来更像是MySql在等待其它提交完成,然后继续进行自己的插入。

3

默认情况下,Rails是单线程的,主要是因为MRI ruby​​具有较差的线程并发支持。您可以尝试通过把Rails的为多线程模式:

config.thread_safe! 

这将是对Rails 4默认在一般情况下,如果需要揭开序幕Rails中长时间运行的过程中,你可能想要做使用诸如DelayedJob,ResqueBeanstalk之类的独立后台进程的大部分工作。结果可用于其他线程的时间取决于完成所花费的时间以及整个批量插入是在单个事务中还是多个较小的事务。

+0

对不起,误解,最后一句让我很困惑,是否涉及到使用后台进程或没有后台进程?您建议的后台进程是否会阻止其他mysql操作的“等待”? – freedom 2013-03-19 18:26:14

+0

如果您在单独的后台进程中执行批量插入操作,那么在浏览器中触发插入操作的用户无需等待它完成,并且该导入工作进程不会被束缚。但是,如果批量插入发生在单个事务中,则无论您如何运行它,都无法查看数据,因为在事务完成之前,mysql会隐藏它。这很好,因为在事务结束之前,它可能会回滚;这首先是使用交易的主要观点。 – sockmonk 2013-03-19 18:34:36

+0

好打电话,我一定会试试这个!谢啦 – freedom 2013-03-19 18:45:55