有没有办法检查Windows中的多处理标准模块是否正在加载模块?

时间:2013-08-13 18:00:44

标签: python windows multiprocessing

我相信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___)

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

2 个答案:

答案 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-NN为正整数。请注意,不保证父进程的名称,因此执行:

process.name == 'MainProcess'

可靠。你应该这样做:

import re
re.match(r'Process-\d+', process.name)