“什么是安全的方法?”;“绑定”;python中的环境变量?
假设我们有一个库“什么是安全的方法?”;“绑定”;python中的环境变量?,python,multithreading,environment-variables,Python,Multithreading,Environment Variables,假设我们有一个库a开关行为取决于一些 环境变量配置路径实际上。我的一些任务使用 此库为每个任务提供不同的配置路径。我在一个很短的时间内做这件事 方式 在所有任务同步处理之前,此操作将一直有效。但现在我需要 此任务处理中的并发性 那么,我如何才能保证每项任务都不会破坏另一项任务 如果我在单独的线程/进程中运行每个任务,它会有自己的配置路径 或者类似的东西。有几种方法可以解决这个问题: 在子进程中运行每个任务,而不是在不同线程中的一个进程中运行所有任务 将任务更改为将A_CONFIG_PATH值作为
a
开关行为取决于一些
环境变量<代码>配置路径实际上。我的一些任务使用
此库为每个任务提供不同的配置路径。我在一个很短的时间内做这件事
方式
在所有任务同步处理之前,此操作将一直有效。但现在我需要
此任务处理中的并发性
那么,我如何才能保证每项任务都不会破坏另一项任务
如果我在单独的线程/进程中运行每个任务,它会有自己的配置路径
或者类似的东西。有几种方法可以解决这个问题:
在子进程中运行每个任务,而不是在不同线程中的一个进程中运行所有任务
将任务更改为将A_CONFIG_PATH
值作为参数,而不是从环境中读取它(从env读取与依赖全局变量一样糟糕…)
不要将字符串分配给os.environ[a\u CONFIG\u VALUE]
,而是使用一个对象,它允许每个线程都有自己的值。不过,您需要稍微更改读取值的部分
使用threading.local
的示例:
#one time init
os.environ['A_CONFIG_PATH'] = threading.local()
# set the value
def task(**kw):
os.environ['A_CONFIG_PATH'].value = '/home/me/current/task/config/path'
A.do_some_stuff(kw)
# read the value
config_path = os.environ['A_CONFIG_PATH'].value
编辑:因为您说过正在使用os.getenv
读取env变量,所以您可以将第三个解决方案与此hack结合起来,用您自己的解决方案替换os.getenv
:
# one time init
orig_getenv = os.getenv
def getenv_hacked(key, default=None):
if key == 'A_CONFIG_PATH':
return orig_getenv(key, default).value
else:
return orig_getenv(key, default)
os.getenv = getenv_hacked
os.environ['A_CONFIG_PATH'] = threading.local()
问题实际上是A
库通过os.getenv('A\u CONFIG\u PATH')
使用这个变量,而不是我的代码。那么第三种方法在这种情况下是否仍然合适呢?解决方案#3对我不起作用,但我无法正确设置ipython输出的格式,因此请参见此处的新问题:
# one time init
orig_getenv = os.getenv
def getenv_hacked(key, default=None):
if key == 'A_CONFIG_PATH':
return orig_getenv(key, default).value
else:
return orig_getenv(key, default)
os.getenv = getenv_hacked
os.environ['A_CONFIG_PATH'] = threading.local()