是否可以在带有 Windows 的模块中使用多处理?

Tyl*_*ler 5 python windows multiprocessing

我目前正在研究一些预先存在的代码,目的是加快速度。有几个地方非常适合并行化。由于 Python 具有 GIL,我想我会使用多进程模块。

但是,根据我的理解,这将在 Windows 上工作的唯一方法是,如果我从具有if __name__=='__main__' 保护措施的最高级别脚本中调用需要多个进程的函数。然而,这个特定的程序是作为一个模块来分发和导入的,所以让用户复制和粘贴这个保护措施有点笨拙,我真的很想避免这样做。

就多处理而言,我是运气不好还是误解了什么?或者有没有其他方法可以在 Windows 上做到这一点?

Rol*_*ith 1

在 ms-windows 上,您应该能够导入程序的主模块,而不会产生启动进程等副作用。

当Python导入一个模块时,它实际上运行它。

因此,做到这一点的一种方法是在if __name__ is '__main__'区块中。

另一种方法是在函数内执行此操作。

以下内容不适用于 ms-windows:

from multiprocessing import Process

def foo():
    print('hello')

p = Process(target=foo)
p.start()
Run Code Online (Sandbox Code Playgroud)

这是因为它在导入模块时尝试启动一个进程。

编程指南中的以下示例是可以的:

from multiprocessing import Process, freeze_support, set_start_method

def foo():
    print('hello')

if __name__ == '__main__':
    freeze_support()
    set_start_method('spawn')
    p = Process(target=foo)
    p.start()
Run Code Online (Sandbox Code Playgroud)

因为导入模块时 if 块中的代码不会运行。

但将其放入函数中也应该可以:

from multiprocessing import Process

def foo():
    print('hello')

def bar()
    p = Process(target=foo)
    p.start()
Run Code Online (Sandbox Code Playgroud)

当这个模块运行时,它会定义两个新函数,然后不运行。

  • 无论谁编写使用此模块的程序,仍然需要编写自己的 if __name__ == '__main__'` 防护。问题是是否有办法避免这种情况。 (2认同)