2015-12-15 49 views
1

我打电话的外部库从铁轨这样的:这段代码阻止Rails为其他用户服务吗?

%x(jasperstarter pr #{template_path} -f #{format} --data-file #{data_path} --xml-xpath #{xpath} -t xml -o #{output_path})

我的问题是这会引起其他要求到现场必须等待这个过程完成之前?如果是这样,我可以缓解这种情况的方式是什么?

注意:此代码正在网站管理员端运行,以生成报告,理想情况下不应该中断站点的客户。

回答

1

运行此命令的Ruby线程将会阻塞,直到命令完成,因此如果您有一个线程处理一个线程处理所有请求,那么其他请求将不得不等待。您可以通过多种方式避免阻止其他请求:

  • 运行多个Web进程,因此可以在运行此命令的进程外部处理其他请求。
  • 运行一个并发的网络服务器,如PumaUnicorn,因此该命令仅阻止服务器运行的几个线程中的一个来处理请求。
  • 通过像Resque这样的作业队列在后台工作器中运行该命令。
  • 自己在另一个Thread中运行该命令。
  • 完全在web进程之外运行该命令,例如从终端或通过cron运行该命令。
+0

理想情况下,我希望它的行为像它在后台处理一样,但是该进程正在运行,用户希望立即返回输出。所以我想并发webserver似乎要走的路? – harinsa

+0

如果您通过网络请求触发此事件,并且您想立即回复用户,我建议将作业排入后台队列。即使使用并发Web服务器,尽管您没有阻止其他请求,但触发此命令的请求仍将等待它完成。 –

+0

我明白了,谢谢。 – harinsa

相关问题