【发布时间】: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 将设置传递给进程,除非您写入文件,然后告诉孩子从文件中读取(不是那么优雅......)
标签: python windows multiprocessing