所以我有一段代码" train.py"就像
do something
print('log something...')
do something else
我使用了pytorch的多处理工具箱
import torch.multiprocessing as mp
执行" train.py"的多线程,但是,print函数在python3下运行良好,但不能运行python2。为什么呢?
答案 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中工作。