【发布时间】:2022-01-06 08:37:03
【问题描述】:
我正在制作一个在 ProcessPoolExecutor 中运行进程并在完成后返回结果的程序。我要运行的脚本使用了相当旧的库,所以我不想将它们包含在主脚本中。相反,我设置了另一个虚拟环境来运行子进程。
我正在使用 ProcessPoolExecutor 来生成作业。在运行这些作业时如何选择要使用的 python 解释器?
我看到 ProcessPoolExecutor 有一个 initargs 参数,但是当我将它包含在我的代码中时:
with concurrent.futures.ProcessPoolExecutor(
initargs=('PYTHONHOME', r'C:\Users\Tom.Mclean\Anaconda3\envs\weatherrouting_v1')) as pool:
return await loop.run_in_executor(pool, fn, *args)
它刚刚崩溃了。
编辑:
with concurrent.futures.ProcessPoolExecutor() as pool:
pool._mp_context.set_executable(r'C:\Users\Tom.Mclean\Anaconda3\envs\weatherrouting_v2\python.exe')
return await loop.run_in_executor(pool, fn, *args)
【问题讨论】:
-
initargs用于initializer函数。两者都在过程开始后使用,因此它们不适合您想要做的事情。 -
@MisterMiyagi 嗯,看来我想要的相当于
multiprocessing.set_executable()函数,有没有ProcessPoolExecutor的等价函数? -
在某种程度上,是的。您可以为
ProcessPoolExecutor提供带有自定义可执行文件的multiprocessing上下文。但是,我只是在 CPython 3.9 到 PyPy 3.7 上进行了尝试——启动进程有效,但concurrent.futures的部分不同足以立即破坏。 -
@MisterMiyagi 我对我的问题所做的编辑对我有用,对你有用吗?
-
它只有在两个 Python 都与主进程兼容时才有效'
concurrent.futures。因此,如果您有另一个相同 Python 版本的 venv 但很可能不是跨 Python 版本,它会起作用。