是否可以使用Ruby Threading终止已经运行的延迟作业?

cor*_*ded 5 delayed-job ruby-on-rails-3

假设我在后台运行了delayed_job.任务可以安排或立即运行(有些是长期任务,有些则不是)

如果任务太长,用户应该可以取消它.延迟工作有可能吗?我检查了文档,似乎无法找到终止方法或其他东西.它们只提供一个捕获来取消延迟的作业本身(因此取消所有任务......我只需要取消某个正在运行的任务)

更新 我的老板(谁是一个伟大的程序员顺便说一句)建议使用Ruby Threading来实现我们的这个功能.这可能吗?就像为每个任务创建新线程并在其运行时杀死该线程一样?

就像是:

t1 = Thread.new(task.run)
self.delay.t1.join (?) -- still reading on threads so correct me if im wrong
Run Code Online (Sandbox Code Playgroud)

然后停止它我只会使用t1.stop(?)再次不知道

这可能吗?谢谢!

cor*_*ded 3

看来我的老板击中了要害,所以这就是我们所做的(请告诉我们这是否有可能是不好的做法,以便我可以提出):

  1. 首先,我们有一个具有 defexecute 的 Job 模型!(它运行它应该做的事情)。
  2. 接下来,我们在后台有delayed_job工作人员,监听新的工作。现在,当您创建作业时,您可以安排它立即运行或每隔一天运行(我们对此使用 rufus)
  3. 创建作业时,它会检查它是否应该立即运行。如果是,它将自己添加到延迟作业队列中。执行函数创建一个线程,因此每个作业都有自己的线程。
  4. 用户界面中的用户可以查看作业是否正在运行(如果有started_at且没有finished_at)。如果它正在运行,有一个按钮可以取消它。取消它只是将作业的cancel_at 设置为Time.now。
  5. 当作业运行时,它还会检查自身是否有 Canceled_at 或是否Time.now为 > finished_at。如果是这样,则杀死该线程。

瞧!我们已经针对一项工作测试了它,它似乎有效。现在唯一的问题是缩放......

如果您发现任何问题,请在评论中这样做,或者提供更多建议(如果有的话):)我希望这也能对某些人有所帮助!