Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“什么是安全的方法?”;“绑定”;python中的环境变量?_Python_Multithreading_Environment Variables - Fatal编程技术网

“什么是安全的方法?”;“绑定”;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()