多流程管理

时间:2016-02-16 16:43:17

标签: ruby-on-rails ruby process multiprocessing

只是想知道最好的方法是什么: 假设我有3个进程,每个进程都完成它的工作,计算并将数据传递给最终进程,该进程的功能是从其他进程获取数据并填充数据库。

离开最终过程的原因是其他3个过程可能需要一个可变的时间才能完成,因此我希望每个过程在完成其工作后立即将数据传递给最终过程为了避免浪费时间,我不希望多个进程同时写入数据库。 但要做到这一点,每个进程都需要知道最终进程是否繁忙,如果可用则发送数据,否则在发送之前等待它完成。 我的想法是使用'随时'的宝石并创建3个可以独立运行的进程,但我对最后一个进程感到困惑,因为我对守护进程等不太了解,而且我知道我可能正在做所有的这比实际情况复杂得多。

欢迎任何建议,谢谢。

1 个答案:

答案 0 :(得分:1)

所以我想我可以提供一些你的问题的见解。我的开发团队使用由我们的数据库支持的本地消息队列。这意味着消息(作业元数据)存储在我们的messages表中。

我们的rails应用程序然后使用daemons gem创建一个守护进程。它使实例化守护进程变得更加简单。没有必要害怕daemo进程是什么;它们只是在后台运行的linux / unix进程。

你特别提到你不希望多个进程写入你的数据库这听起来好像你担心多个守护进程试图读/写到同一个表的死锁问题(请如果你不是,请纠正我,所以我可以修改我的答案。)

为了避免此问题,您可以使用row-level locking作为邮件表。这样,守护进程就不必在每次想要查看是否有任何工作需要时锁定整个表。

你还提到使用3个进程(我也称之为守护进程的守护进程)来执行任务,然后一旦完成这三个进程,就通知另一个进程。您可以将此功能实现为3名工作人员留下的特定/唯一消息。

例如:工人A完成了他的工作,因此他向special_messages_table写了一条自定义消息。工人B和C完成任务,并写入此表。现在这些守护进程正在处理的整个时间,您的第三个守护进程将轮询special_messages_table以查看这三个作业的任何组合是否已完成。一旦它检测到它们有,它就可以启动。

这只是一个大致概述如何使用守护进程来完成您的要求。如果您提供更多详细信息,我很乐意改进我的答案。不要害怕守护进程!