在 Rails begin-end 块中启动异步进程会导致问题吗?

Will starting an async process within a Rails begin-end block cause an issue?

我希望在 rails 的 begin-end 块中启动一个异步工作任务。例如:

begin
 a = 1
 b = a + 2
 Workers::SideKiqAsynTask.new().process
end

我无法理解开始是否会等待作为 Sidekiq 异步进程的 Workers 任务完成。

简短版本是 运行 异步的 Sidekiq 作业,不会阻止 begin...end。也就是说,看起来您可能正在尝试使用更深入的 Sidekiq class。

较长的解释:

因此,如果您尝试启动单个任务的单个 运行,您通常会创建一个包含 Sidekiq::Worker 模块的新 class。然后定义一个名为 perform 的方法来异步完成您想要完成的工作。然后你给你的工人打电话 perform_async 。它看起来像这样:

# in app/workers
class MyCoolWorker
  include Sidekiq::Worker

  def perform(numbers)
    crunch_numbers_for_a_long_time(numbers)
  end
end

# wherever you want to kick off a task
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
MyCoolWorker.perform_async(numbers)

您还可以在特定时间安排任务

MyCoolWorker.perform_in(1.hour)

您需要安装 Redis 和 运行 Sideqik with bundle exec sidekiq

perform_asyncperform_in 只会告诉 sidekiq "Hey please do this for me when you can / at the time I tell you" 很快就完成了。实际工作由 Sidekiq 在不同的 Ruby 流程中完成。

Sidekiq 的文档中有一个很好的帮助位置:

https://github.com/mperham/sidekiq/wiki/Getting-Started

甚至还有演示文稿:)