我有一个名为Workflow
的模型,并在其上定义了一个名为execute
的操作。 Workflow
有许多Step
s。
每次执行Workflow
时,我都希望创建另一个名为Job
的模型的实例。此外,某种后台作业将浏览Step
中的Workflow
列表并运行它们。
目前,我在Job
操作中创建并保存了Workflow#execute
的实例。但是执行连续步骤的后台工作将在app/classes
下的某个类中定义。它可能会在一个单独的线程中运行。
我想在Step
作为模型的上下文中表示每个Job
的正在运行的实例 - 将其称为Task
。我需要从这个后台作业创建Task
s的实例。
Task
对象是否是线程安全的?答案 0 :(得分:1)
是的,如果Rails环境在尝试该过程的进程中加载,您可以。
如果没有特别的预防措施,它将不是线程安全的。有许多方法可以确保线程安全,最简单的方法是不使用类变量来跟踪状态并使用围绕数据库操作的显式事务。绝对肯定,您可以将线程敏感操作包装在互斥锁中。
是的,使用后台作业解决方案而不是原始线程来处理任务。 Resque,Sideqik和Rails为初学者提供了自己的DelayedJob。这些提供了管理任务,处理错误,安排等的方法。如果您选择这样做,您可能不需要专用的Task
模型,因为它的角色将由实际的后台工作类执行。