如何在 Windows 上的多个进程上存储持久设置

Posted

技术标签:

【中文标题】如何在 Windows 上的多个进程上存储持久设置【英文标题】:How to store persistent settings over multiple processes on windows 【发布时间】:2021-11-21 12:28:31 【问题描述】:

我的程序在启动命令行参数时处理,从设置文件中读取一些设置并覆盖我在设置类中的标准值。此设置实例设置一次,之后才读取。我可以在程序的任何地方导入设置并使用它们。例如,目录的路径由用户在启动时提供,稍后在程序中使用。 问题是我想使用多处理并且我必须使用 Windows。在 Windows 上,我必须使用 spawn method 创建一个新进程,该进程从一个新的 python 解释器进程开始,并删除对设置所做的所有更改。 (下面的示例代码)

我想知道是否有更智能的方法来存储设置。

# settings.py
class Settings:
    path = None


settings = Settings()


# main.py
import multiprocessing
from settings import settings


def print_path():
    print(f"Path: settings.path")


if __name__ == "__main__":
    settings.path = "test.csv"  # user input

    with multiprocessing.Pool(4) as pool:
        pool.apply(func=print_path)  # prints "Path: None" but I'd like to see "Path: test.csv"

【问题讨论】:

这些设置是否需要在主进程重新启动时保持不变,或者您只是想将设置数据传递给池中的子进程? 我只是想将设置数据传递给池中的子进程。我可以将它们作为参数传递并在子进程的开头覆盖它们,但我认为这相当难看。而且我认为可能有一个更优雅的解决方案来“存储”设置数据。 如果设置的所有初始化都由主进程完成并且从那时起您指示设置是只读的(或者我错过了什么),为什么子进程会覆盖设置)?您只需要像现在显示的那样将设置初始化代码not作为全局代码完成。您要确保任何设置初始化代码仅由主进程执行。这样settings = Settings() 在全局范围内的声明就变得非常有问题。 @R.Ghazaleh “我认为可能有更优雅的解决方案”:不。 Booboo 在这里是正确的。需要通过初始化 func / args 将设置传递给进程,除非您写入文件,然后告诉孩子从文件中读取(不是那么优雅......) 【参考方案1】:

正如我所评论的,您希望将所有与初始化设置相关的代码放在一个仅由主进程执行的代码块中。最简单的方法是创建一个名为init_settings 的函数并将代码放在那里,该函数将由if __name__ == '__main__': 块中的代码或在此类块中调用的函数调用。可以保留全局范围类定义(它们的执行开销很小),尤其是在子流程需要它们的情况下。然后您可以使用每个池进程的设置初始化一个全局变量,这样就不必为每个提交的任务传递它,而只需为池中的每个进程传递一次。

不过,我有点困惑。你有from settings import settings,然后你用settings = Settings()破坏settings

大致思路如下:

# Assumption that this is used by all tasks and must be initialized
class Settings:
    ...

def init_settings()
    """
    Function responsible for creating the settings instance.
    """
    # only this function needs to do this import:
    from settings import settings
    ...
    settings = Settings()
    # Initialize this
    settings.path = "test.csv"
    ... # etc.
    return settings

def init_pool(the_settings):
    """ Initialize global variable for each process in the pool """
    global settings
    settings = the_settings

def print_path():
    print(f"Path: settings.path")

if __name__ == '__main__':
    import multiprocessing

    settings = init_settings()
    # Initialize the pool with the settings as a global variable
    with multiprocessing.Pool(4, initializer=init_pool, initargs=(settings,)) as pool:
        pool.apply(func=print_path) # blocks until complete

【讨论】:

以上是关于如何在 Windows 上的多个进程上存储持久设置的主要内容,如果未能解决你的问题,请参考以下文章

如何解决win7开启服务提示错误1067进程意外终止

将文件放置在 GKE 上的 Kubernetes 持久卷存储中

如何在 Android 上的 Firebase 存储中设置持久性?

多用户 Windows 服务器上的端口号处理

如何了解哪个进程删除了硬盘上的文件

windows进程启动设置时区限制