Rails Async Active Job 不执行代码,而 inline 执行

Rails Async Active Job doesn't execute code, while inline does

:async 队列适配器真的有作用吗?

:inline,这是Rails 4 中的默认设置,在当前执行线程中处理使用ActiveJob 构建的作业,呃... inline。异步,不应该。它应该在当前线程中使用 ConnectionPool 而不是 运行 它,理想情况下会发生这种情况。它会 运行 在当前执行线程之外执行。

但没有执行它。

我仔细阅读了文档,我唯一能理解的是 :async 与 :inline 不同,它不执行任务,并希望您围绕本地执行构建一个系统。我必须对所有作业手动执行 perform 才能让它们在本地执行。当我将适配器设置为 :inline 时,无需执行即可正常工作。

是否有一些我遗漏的配置问题阻止异步正常工作(比如 ActionCable?)。

如果从 rake 任务(或控制台)执行它是否不起作用?

它与 :sidekiq/:resque 一起工作得很好,但我不想 运行 一直在本地使用这些。

Rails by default comes with an "immediate runner" queuing implementation. That means that each job that has been enqueued will run immediately.

这是某种提示我哪里出了问题的原因。我有一些工作在某个地方排队,但 运行。是什么阻止了这一切?

这是我发现的。随着 concurrent-ruby 的出现,rake 任务并没有设置来处理这个问题。

如果您阅读文档,它会说 :async,当进程结束时它会从内存中清除。

Rails itself only provides an in-process queuing system, which only keeps the jobs in RAM. If the process crashes or the machine is reset, then all outstanding jobs are lost with the default async back-end.

Rake 进程在结束时结束。所以,如果你正在做任何类型的数据更改,rake 任务将不会打开足够长的时间来 运行 一个工作,这就是为什么它们 运行 :inline 很好,但不是:async.

所以,我还没有想出一个解决方案来保持 rake 任务打开足够长的时间以 运行 某事 :async(并保持应用程序 :async 整个时间)。我必须将其切换到 :inline 到 运行 任务,然后在完成其余工作后返回到 :async。这就是为什么它与 :sidekiq:resque 一起正常工作的原因,因为这些应用程序将作业信息保存在内存中并且不会在 rake 任务结束时释放。

为了让 rake 任务在本地与 :async 一起工作,如果你在本地直到 rake(作为task 运行ner) 了解如何在启动(或未启动)异步任务时保持打开状态。作为一个仅供开发的功能,这并不是真正的高优先级,但是,如果你正在抨击 table 不理解为什么 :async 默认任务 运行 工作不会'实际上 运行,这就是为什么。

以下是您可以在 rake 任务结束时放置的内容,以等待 AsyncAdapter 在退出 rake 任务之前完成处理:

if Rails.configuration.active_job.queue_adapter == :async
  executor =
    ActiveJob::Base._queue_adapter.instance_eval do
      @scheduler.instance_eval { @async_executor }
    end
  sleep(0.1) while executor.scheduled_task_count > executor.completed_task_count
end