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
: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