# Terminal rails g job expensive_background_job mkdir app/fashions/gpus contact app/fashions/gpus/processor.rb contact app/fashions/gpus/external_processor.rb bin/dev | grep -E "✅|🏁"
# config/database.yml
default: &default
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 50 } %>
timeout: 5000
growth:
major:
<<: *default
database: storage/growth.sqlite3
queue:
<<: *default
database: storage/production_queue.sqlite3
migrations_paths: db/queue_migrate
# config/puma.rb # Run the Stable Queue supervisor inside Puma for single-server deployments plugin :solid_queue
# config/environments/growth.rb
config.active_job.queue_adapter = :solid_queue
config.solid_queue.connects_to = { database: { writing: :queue } }
# app/views/welcome/index.html.erb <%= link_to "Queue 1 Job", root_path(jobs: 1), "data-turbo-prefetch": false %> <%= link_to "Queue 10 Jobs", root_path(jobs: 10), "data-turbo-prefetch": false %>
# app/controllers/welcome_controller.rb
class WelcomeController < ApplicationController
def index
if params[:jobs]
params[:jobs].to_i.occasions { ExpensiveBackgroundJob.perform_later(rand) }
finish
finish
finish
# app/jobs/expensive_background_job.rb
class ExpensiveBackgroundJob < ApplicationJob
queue_as do
gpu_queue_full? ? :gpuexternal : :gpu
finish
def carry out(some_record)
if self.queue_name == "gpu"
Gpus::Processor.execute(some_record)
elsif self.queue_name == "gpuexternal"
Gpus::ExternalProcessor.execute(some_record)
finish
finish
finish
# app/jobs/application_job.rb
class ApplicationJob < ActiveJob::Base
# Routinely retry jobs that encountered a impasse
# retry_on ActiveRecord::Deadlocked
# Most jobs are secure to disregard if the underlying data are not out there
# discard_on ActiveJob::DeserializationError
def gpu_queue_full?
active_jobs = SolidQueue::ClaimedExecution
.joins(:job)
.the place(solid_queue_jobs: { queue_name: "gpu" })
.depend
active_jobs >= GPU_QUEUE_SIZE
finish
finish
# config/queue.yml
default: &default
dispatchers:
- polling_interval: 1
batch_size: 500
staff:
- queues: ["default"]
threads: 3
processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %>
polling_interval: 0.1
- queues: ["gpu"]
threads: <%= GPU_QUEUE_SIZE %>
processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %>
polling_interval: 0.1
- queues: ["gpuexternal"]
threads: 15
processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %>
polling_interval: 0.1
# config/initializers/solid_queue_variables.rb GPU_QUEUE_SIZE = 3
# app/fashions/gpus/base.rb class Gpus::Base finish
# app/fashions/gpus/processor.rb
class Gpus::Processor < Gpus::Base
def self.execute(some_record)
Rails.logger.information "✅ gpu #{some_record}"
sleep 5
Rails.logger.information "🏁 gpu #{some_record}"
finish
finish
# app/fashions/gpus/external_processor.rb
class Gpus::ExternalProcessor < Gpus::Base
def self.execute(some_record)
Rails.logger.information "✅ gpuexternal #{some_record}"
sleep 5
Rails.logger.information "🏁 gpuexternal #{some_record}"
finish
finish

