在python 3中,你现在可以像这样使用with
子句安全地打开文件:
with open("stuff.txt") as f:
data = f.read()
使用这种方法,我不需要担心关闭连接
我想知道我是否可以对多处理做同样的事情。例如,我当前的代码如下所示:
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
pool.starmap(function,list)
pool.close()
pool.join()
有什么方法可以使用 with 子句来简化这一点吗?
with multiprocessing.Pool( ... ) as pool:
pool.starmap( ... )
https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool
版本 3.3 中的新功能:池对象现在支持上下文管理协议 – 请参阅上下文管理器类型。enter(( 返回池对象,exit(( 调用 terminate((。
您可以在Pool
部分的底部看到一个示例。
虽然它比OP要求的要多,但如果你想要一些同时适用于Python 2和Python 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 3方式进行多处理,无论您使用的是哪个版本的Python。例如:
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中工作。