python2和python3在多处理方面的区别?

时间:2017-09-30 23:06:16

标签: multiprocessing pytorch

所以我有一段代码" train.py"就像

    do something
    print('log something...')
    do something else

我使用了pytorch的多处理工具箱

    import torch.multiprocessing as mp

执行" train.py"的多线程,但是,print函数在python3下运行良好,但不能运行python2。为什么呢?

2 个答案:

答案 0 :(得分:0)

因此,在python 2多处理中,默认情况下,新的进程创建是fork()方法,并且分叉多线程进程可能会出现问题。

Pytorch使用多线程进程,并且为了安全地进行操作,他们使用了下面提到的python 3功能

import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    mp.set_start_method('spawn')

请注意,以上代码段仅适用于python3。它们使用方法“ set_start_method”,并要求python解释器使用“ spawn”(而不是“ fork”)开始新的过程

正如我所说,以上方法仅适用于python 3的多处理模块,并且由于python 2的多处理模块没有“ set_start_method ”,因此您的代码

import torch.multiprocessing as mp

可能无法按预期工作。它不会给您带来错误,但是计算结果不可靠

答案 1 :(得分:0)

尽管存在更多差异,但主要差异之一是使用with语句。理解差异的一种简单方法是查看如何对Python 2和Python 3使用with进行多重处理。如果添加(在Python 2或3中):

# For python 2/3 compatibility, define pool context manager
# to support the 'with' statement in Python 2
if sys.version_info[0] == 2:
    from contextlib import contextmanager
    @contextmanager
    def multiprocessing_context(*args, **kwargs):
        pool = multiprocessing.Pool(*args, **kwargs)
        yield pool
        pool.terminate()
else:
    multiprocessing_context = multiprocessing.Pool

此后,无论使用哪个版本的Python,都可以使用常规的Python 3方式进行多处理。例如:

def _function_to_run_for_each(x):
       return x.lower()
with multiprocessing_context(processes=3) as pool:
    results = pool.map(_function_to_run_for_each, ['Bob', 'Sue', 'Tim'])    print(results)

将在Python 2或Python 3中工作。