我相信Windows,因为没有 fork ,多处理模块会在新的Python进程中重新加载模块。
您需要在主脚本中使用此代码,否则会发生非常严重的崩溃
if __name__ == '__main__':
from multiprocessing import freeze_support
freeze_support()
我有一堆模块在模块级别有调试打印语句。因此,只要加载模块,就会调用print语句。
每当我并行运行某些内容时,所有这些打印语句都会被执行。
我的问题是,是否有方法可以查看多处理模块是否正在导入模块,如果是这样,那么这些打印语句会被静音吗?
我基本上在寻找是否有类似的东西:
import multiprocessing
if not multiprocessing.in_parallel_process:
print('Loaded module: ' + __name___)
到目前为止我一直无法找到它。这可能吗?
答案 0 :(得分:6)
是,多处理模块确实提供了一种检查模块是在子进程中还是在主进程中执行的方法。
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
答案 1 :(得分:1)
是的,您可以从multiprocessing.current_process()
返回的实例中获取有关当前流程的信息。特别是Process
构造函数有一个name
参数,可用于区分子进程。
请注意,在python2中,如果您不明确指定name
,那么模块不会对所使用的格式提供任何保证,因此您< em>无法可靠地区分子进程和主进程:必须始终明确指定它。
在python3中,子进程保证名称格式为Process-N
,N
为正整数。请注意,不保证父进程的名称,因此执行:
process.name == 'MainProcess'
不可靠。你应该这样做:
import re
re.match(r'Process-\d+', process.name)