我想知道将设置从 RQ 工作人员传递到任务功能的最佳方法是什么?
我想将我的所有设置保留在应用程序之外的文本文件中,然后在工作人员启动时读取它,然后将这些值用于执行实际任务。
现在我正在使用 os.environ。
谢谢!
我想知道将设置从 RQ 工作人员传递到任务功能的最佳方法是什么?
我想将我的所有设置保留在应用程序之外的文本文件中,然后在工作人员启动时读取它,然后将这些值用于执行实际任务。
现在我正在使用 os.environ。
谢谢!
从“自定义工作者类”部分的文档中可以看出,这样做的方法是编写一个自定义工作者类。这是我一直在使用的一种模式,它将ConfigParser
文件中的一个部分加载到名为的虚拟 python 模块中config
:
import configparser
import rq.worker
import sys
import types
class ConfigurableWorker(rq.worker.Worker):
"""An RQ Worker class which loads configuration from config.ini"""
def work(self, *args, **kwargs):
"""Perform RQ work"""
# Store some configuration on a virtual module
sys.modules['config'] = types.ModuleType('config')
import config
config_reader = configparser.ConfigParser()
config_reader.read('config.ini')
for key, value in config_reader['rq'].items():
setattr(config, key, value)
# Do work
super().work(*args, **kwargs)
然后从工作职能:
def my_bunch_of_work():
import config
con = db_connection(url=config.my_db_connection)
可以使用参数来运行带有客户工作人员类的 rq 工作人员--worker-class
。
$ rq worker --worker-class my.prog.ConfigurableWorker
在该方法中进行某种连接池设置可能会很好ConfigurableWorker.work
,但我不确定它的安全性,但我不太了解 RQ worker fork 模型os.fork()
尝试使用该os
模块。
#IN WORKER
import os
os.environ['TOKEN'] = 'xxx'
# IN JOB
#Open child processes via os.system(), popen() or fork() and execv()
someVariable = os.environ['TOKEN']