После более глубокого изучения python rq, сделали следующим образом, вместо запуска
rq worker, мы запускаем скрипт
python run_rq.py. Почти не измененный пример из документации.
# run_rq.py
import sys
from rq import Connection
from worker import CustomWorker
# Preload libraries
from pydarknet import Detector
detector = Detector(bytes('cfg/yolov3.cfg', encoding='utf-8'),
bytes('weights/yolov3.weights', encoding='utf-8'),
0,
bytes('cfg/coco.data',encoding='utf-8'))
# Provide queue names to listen to as arguments to this script,
# similar to rq worker
with Connection():
qs = sys.argv[1:] or ['default']
w = CustomWorker(qs)
w.detector = detector
w.work()
# worker.py
from rq.worker import (DEFAULT_JOB_MONITORING_INTERVAL, DEFAULT_RESULT_TTL,
DEFAULT_WORKER_TTL, Worker)
import settings
class CustomWorker(Worker):
def __init__(self, queues, name=None, default_result_ttl=DEFAULT_RESULT_TTL,
connection=None, exc_handler=None, exception_handlers=None,
default_worker_ttl=DEFAULT_WORKER_TTL, job_class=None,
queue_class=None,
job_monitoring_interval=DEFAULT_JOB_MONITORING_INTERVAL):
super(CustomWorker, self).__init__(queues, name, default_result_ttl,
connection, exc_handler, exception_handlers, default_worker_ttl,
job_class, queue_class,job_monitoring_interval)
self.detector = None
def execute_job(self, job, queue):
if not self.detector is None:
job.detector = self.detector
super(CustomWorker, self).execute_job(job, queue)
# tasks.py
from rq import get_current_job
import settings
def send():
job = get_current_job()
if not job.detector is None:
# do more work
Далее внутри кастомного воркера в методе execute_job мы и передаем инстанс detector в внутрь Job.
Таким образом каждый инстанс Job получает уже посчитанный заранее Detector.