Python >> Python Program >  >> Python

Hur skapar man flera arbetare i Python-RQ?

Såvitt jag vet har RQ ingen möjlighet att hantera flera arbetare. Du måste starta en ny arbetsprocess som definierar vilken kö den kommer att förbruka. Ett sätt att göra detta på som fungerar ganska bra för mig är att använda Supervisor. I supervisor konfigurerar du din arbetare för en given kö och antal processer att ha samtidighet. Till exempel kan du ha kö "hög prioritet" med 5 arbetare och kö "låg prioritet" med 1 arbetare.


Det är inte bara möjligt utan idealiskt att köra flera arbetare. Jag använder en bash-fil för startkommandot för att ange den virtuella env och starta med en anpassad Worker-klass.

Här är en supervisor-konfiguration som har fungerat mycket bra för mig för RQ-arbetare, även under en produktionsbelastning. Observera att startförsök är hög eftersom detta körs på AWS och behöver försök igen under driftsättningar.

[program:rq-workers]
process_name=%(program_name)s_%(process_num)02d
command=/usr/local/bin/start_rq_worker.sh
autostart=true
autorestart=true
user=root
numprocs=5
startretries=50
stopsignal=INT
killasgroup=true
stopasgroup=true
stdout_logfile=/opt/elasticbeanstalk/tasks/taillogs.d/super_logs.conf
redirect_stderr=true

Innehållet i start_rq_worker.sh

#!/bin/bash
date > /tmp/date
source /opt/python/run/venv/bin/activate
source /opt/python/current/env
/opt/python/run/venv/bin/python /opt/python/current/app/manage.py
rqworker --worker-class rq.SimpleWorker default

Jag skulle vilja föreslå en mycket enkel lösning med django-rq:

Exempel på settings.py

...

RQ_QUEUES = {
    'default': {
        'HOST': os.getenv('REDIS_HOST', 'localhost'),
        'PORT': 6379,
        'DB': 0,
        'DEFAULT_TIMEOUT': 360,
    },
    'low': {
        'HOST': os.getenv('REDIS_HOST', 'localhost'),
        'PORT': 6379,
        'DB': 0,
        'DEFAULT_TIMEOUT': 360,
    }
}

...

Kör konfiguration

Kör python manage.py rqworker default low lika många gånger (varje gång i sitt eget skal, eller som sin egen Docker-container, till exempel) som antalet önskade arbetare. Ordningen på köerna i kommandot bestämmer deras prioritet. Vid det här laget lyssnar alla arbetare på båda köerna.

I koden

När du kallar ett jobb att köra, skicka in önskad kö:

För jobb med hög/normal prioritet kan du ringa anropet utan några parametrar, och jobbet kommer in i standardkön. För låg prioritet måste du ange, antingen på jobbnivå:

@job('low')
def my_low_priority_job():
  # some code

Och ring sedan my_low_priority_job.delay() .

Alternativt kan du bestämma prioritet när du ringer:

queue = django_rq.get_queue('low')
queue.enqueue(my_variable_priority_job)