5


,我将建立一个 rails 网站,在一些初始用户输入之后,完成一些繁重的计算(通过对 ruby​​ 的 c 扩展,将使用多线程)。由于这些计算将消耗几乎所有的 cpu 时间(也包括内存),因此一次运行的计算不应超过一个。我也不能使用(异步)后台作业(例如延迟作业),因为 rails 必须显示该计算的结果,并且该站点应该在没有 javascript 的情况下工作。
所以我想我需要一个单独的进程,其中所有 rails 实例都必须将其计算请求排队并等待答案(如果队列已满,可能会出现错误消息),这是一种同步作业管理器。

有谁知道是否有具有这种功能的 gem/插件?(nanite对我来说似乎很酷,但似乎只是异步的,所以 rails 实例不知道计算何时完成。对吗?)
另一个想法是使用分布式 ruby​​ (drb) 编写我自己的,但为什么要发明如果它已经存在,再次轮子?

任何帮助,将不胜感激!

编辑:由于 zaius 的提示,我认为我将能够异步执行此操作,所以我将尝试resque

4

2 回答 2

5

Ruby 有互斥体/信号量。

您可以使用信号量来确保同时只发生一个资源密集型进程。

但是,在其他任务完成时阻止前端进程的想法对我来说似乎并不正确。如果我这样做,我会使用后台工作人员,然后使用带有刷新元标记的页面(或 iframe)来持续检查进度。

这样,您可以对启用和禁用 javascript 的客户端使用相同的代码。而且您的网络应用线程不会阻塞。

于 2011-01-13T09:34:39.043 回答
1

如果你有一个单独的进程,那么你就有一个后台工作......所以你要么可以拥有它,要么你不能......

我所做的是让网站将请求参数写入数据库。然后一个单独的进程在数据库中查找待处理的请求 - 使用守护进程gem。它完成工作并将结果写回数据库。

该网站然后轮询数据库,直到结果准备好,然后显示它们。

虽然我使用 javascript 让它进行轮询。

如果您真的不能使用 javascript,那么您似乎需要在 Web 请求线程中完成工作,或者让该线程等待后台线程完成。

要让 Web 请求线程等待,只需在其中执行一个循环,检查数据库,直到将回复保存回其中。一旦它在那里,你就可以完成线程。

HTH,克里斯

于 2011-01-13T07:27:56.170 回答