7

我相信在 Windows 上,因为没有fork,所以multiprocessing模块会在新的 Python 进程中重新加载模块。

您需要在主脚本中包含此代码,否则会发生非常讨厌的崩溃

if __name__ == '__main__':
    from multiprocessing import freeze_support
    freeze_support()

我有一堆模块,它们在模块级别包含调试打印语句。因此,无论何时加载模块,都会调用 print 语句。

每当我并行运行某些东西时,所有这些打印语句都会被执行。

我的问题是,是否有办法查看多处理模块是否正在导入一个模块,如果是这样,这些打印语句会静音吗?

我基本上是在寻找是否有类似的东西:

 import multiprocessing
 if not multiprocessing.in_parallel_process:
     print('Loaded module: ' + __name___)

到目前为止我一直找不到它。这可能吗?

4

2 回答 2

13

对于 Python 3.8 和更新的使用multiprocessing.parent_process(),它只返回None主进程,对于早期版本,检查name属性的值是否等于MainProcess

from multiprocessing import Process, current_process

if current_process().name == 'MainProcess':
    print('Hello from the main process')
else:
    print('Hello from child process')

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

输出:

Hello from the main process
Hello from child process
hello bob
于 2013-08-18T11:14:49.713 回答
2

是的,您可以从multiprocessing.current_process(). 特别是Process构造函数有一个name参数可以用来区分子进程。

请注意,在 python2 中,如果您没有明确指定,name则模块不会对使用的格式提供任何保证,因此您无法可靠地区分子进程和主进程:您必须始终明确指定它。

在 python3 中,子进程保证有一个格式为Process-NN整数的名称。请注意,不能保证父进程的名称,因此这样做:

process.name == 'MainProcess'

可靠。你应该做:

import re
re.match(r'Process-\d+', process.name)
于 2013-08-13T18:27:47.317 回答