【问题标题】:When all tasks are done call a cleanup task in resque完成所有任务后,在 resque 中调用清理任务
【发布时间】:2013-07-16 22:49:11
【问题描述】:

我有一个 Web 应用程序,它依赖一些工作人员来更新其数据库。这些工作人员将通过互联网获取一些数据,更新相应的条目,然后删除未更新的条目。

当我使用线程时,这很好,因为我可以完全控制执行完成的时间。我必须把它移到 resque,因为线程很棒,但是改变可伸缩性是有问题的,所以现在,每个旧线程现在都是一个工作线程。

效果很好,但现在我遇到了这个问题:我看不到工人何时完成,因此我无法调用清理来删除未更新的条目。

我的旧代码如下所示:

Entry.update_all(updated: false)
Docs.update_all(updated: false)
Stuff.update_all(updated: false)

# ...
# My code that uses find_or_create_by_my_custom_id
# Entry.find_or_create_by_tag(20)
# ...

Entry.delete_all(updated: false)
Docs.delete_all(updated: false)
Stuff.delete_all(updated: false)

目前使用 resque,我在已启动的工作人员(调用主要工作人员以启动整个工作)上进行了此设置:

Resque.enqueue(UpdateEntriesJob, params)
Resque.enqueue(UpdateDocsJob, params)
Resque.enqueue(UpdateStuffJob, params)

我怎样才能控制这些任务何时完成?

【问题讨论】:

    标签: ruby resque


    【解决方案1】:

    你检查了after_perform 钩子

    在你的工作类中添加一个 after_performer 类方法

    class UpdateEntriesJob
       ..... 
       ....
       def self.perform
         ... 
         ...
         ...
       end
       ....
       ....
       ....
    
       def self.after_perform
          ...
          [Write your code over]
          ...
       end
    
    end
    

    希望这是有道理的

    【讨论】:

    • 我唯一的问题是一些工人有 3 到 4 个嵌套工人,这意味着 w1 调用 w2,w2 调用 w3,w3 调用 w4。
    • @NicosKaralis 确实有一个工人,你知道它总是列表中的最后一个,然后after_perform 可能会采用有趣的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多