用户注销时停止sidekiq worker

我只想在用户登录时执行后台作业。当用户登录时,我启动一个worker:

Warden::Manager.after_authentication do |user,auth,opts| ImapWorker.perform_async(user.id) end 

我所有的ImapWorker都使用ruby的Net::Imap API来等待来自远程电子邮件服务器的新电子邮件。 它使用Imap的空闲function来等待新事件。

 class ImapWorker include Sidekiq::Worker def perform(user_id) user = User.find(user_id) imap = Net::IMAP.new('imap.gmail.com',993,true) imap.login(user.email, user.password) imap.select('INBOX') imap.add_response_handler do |resp| if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" check_email end end imap.idle end end 

现在,当我的用户退出时,我想结束工作人员。 我知道在devise ,我可以像这样挂钩注销function:

 Warden::Manager.before_logout do |user,auth,opts| ... end 

但是我究竟如何阻止sidekiq工作者呢?

require 'sidekiq/api'; Sidekiq::ProcessSet.new.each(&:stop!)