喜
我将建立一个rails-website,在一些初始用户输入之后,进行了一些繁重的计算(通过c-extension到ruby,将使用多线程)。因为这些计算几乎消耗所有cpu-time(内存也是如此),所以一次运行的计算决不应该多于一个。我也不能使用(异步)后台作业(比如延迟作业),因为rails必须显示该计算的结果,并且该站点应该在没有javascript的情况下工作。
所以我想我需要一个单独的进程,其中所有rails实例必须排队他们的计算请求并等待答案(如果队列已满,可能是错误消息),一种同步作业管理器。
有没有人知道是否有这样的功能的gem /插件?
(nanite对我来说似乎很酷,但似乎只是异步,因此rails实例不知道计算何时完成。这是正确的吗?)
另一个想法是使用分布式ruby(drb)编写我自己的,但为什么如果它已经存在又发明轮子呢?
任何帮助将不胜感激!
编辑: 由于zaius的提示,我想我将能够异步执行此操作,所以我将尝试resque。
答案 0 :(得分:5)
Ruby有互斥锁/信号量。
您可以使用信号量确保同时只发生一个资源密集型过程。
然而,在其他任务完成时阻止前端进程的想法对我来说似乎不对。如果我这样做,我会使用后台工作者,然后使用带有刷新元标记的页面(或iframe)来持续检查进度。
这样,您可以为启用javascript和禁用的客户端使用相同的代码。并且您的网络应用程序线程没有阻止。
答案 1 :(得分:1)
如果你有一个单独的过程,那么你有一个后台工作......所以要么你可以拥有它,要么你不能......
我所做的是让网站将请求参数写入数据库。然后,一个单独的进程在数据库中查找待处理的请求 - 使用daemons gem。它完成工作并将结果写回数据库。
然后,网站会轮询数据库,直到结果准备就绪,然后显示它们。
虽然我使用javascript来进行轮询。
如果你真的不能使用javascript,那么你似乎需要在Web请求线程中完成工作,或者让该线程等待后台线程完成。
要使Web请求线程等待,只需在其中执行循环,检查数据库,直到将回复保存回其中。一旦它在那里,你就可以完成线程。
HTH,克里斯