Rails:从实用程序类和其他线程

时间:2016-07-13 18:44:20

标签: ruby-on-rails ruby-on-rails-4

我有一个名为Workflow的模型,并在其上定义了一个名为execute的操作。 Workflow有许多Step s。

每次执行Workflow时,我都希望创建另一个名为Job的模型的实例。此外,某种后台作业将浏览Step中的Workflow列表并运行它们。

目前,我在Job操作中创建并保存了Workflow#execute的实例。但是执行连续步骤的后台工作将在app/classes下的某个类中定义。它可能会在一个单独的线程中运行。

我想在Step作为模型的上下文中表示每个Job的正在运行的实例 - 将其称为Task。我需要从这个后台作业创建Task s的实例。

  1. 我可以从app / classes下的任意类访问模型类。
  2. 从不同的线程添加Task对象是否是线程安全的?
  3. 是否有更好的/推荐的模式来处理这种情况?

1 个答案:

答案 0 :(得分:1)

  1. 是的,如果Rails环境在尝试该过程的进程中加载​​,您可以。

  2. 如果没有特别的预防措施,它将不是线程安全的。有许多方法可以确保线程安全,最简单的方法是不使用类变量来跟踪状态并使用围绕数据库操作的显式事务。绝对肯定,您可以将线程敏感操作包装在互斥锁中。

  3. 是的,使用后台作业解决方案而不是原始线程来处理任务。 Resque,Sideqik和Rails为初学者提供了自己的DelayedJob。这些提供了管理任务,处理错误,安排等的方法。如果您选择这样做,您可能不需要专用的Task模型,因为它的角色将由实际的后台工作类执行。