【发布时间】:2018-10-21 19:34:36
【问题描述】:
我需要在 32 位系统范围内运行 Python 脚本以通过第三方应用程序生成/收集数据。但是我想通过numba使用GPU处理数据,所以它必须在64位Python环境中运行。
我已经设置了一个 64 位 Python virtualenv,并测试了一些在其中运行良好的简单 numba 代码。那么我应该如何在父进程中编写代码来调用子进程(multiprocessing 或subprocess 我假设)将切换到 64 位 virtualenv 并使用 numba 进行计算?更具体地说:
- 我应该使用
multiprocessing或subprocess来实现父(32位Python)和子进程(64位Python)机制吗? - 如何在父子进程之间传递大量数据?
可能的代码示例:
def func_32():
# data collection
# using 3rd party API
return data
def func_64(data, output):
# switch to 64 bit virtual env
# using virtualenvwrapper-win
os.system('workon env64bit')
# numba data process
# results stored in output
return None
def main():
data = func_32()
# I think I only need one process since it will be in GPU not CPU
p = multiprocessing.Process(target=func_64, args=(data, output))
p.start()
return output
我在示例代码中遗漏了什么?
【问题讨论】:
-
一般来说,一个 32 位 Python 进程可以通过将 64 位 Python 解释器可执行文件的路径显式传递给
subprocess()(并传递脚本文件的名称)来启动一个 64 位 Python 进程作为参数运行)。我认为multiprocessing.Process不会在这样的混合环境中工作,因为无法指定解释器路径。我不知道使用virtualenv会如何影响事情,但似乎它可能会起作用。您可以从sys.executable(使用该版本运行时)获取 64 位解释器的路径。 -
@martineau 我已经尝试过
subprocess(),但很难找到将数据从func_32()传递到func_64()的好方法。似乎数据必须通过stdin和stdout。我最终使用了multiprocessing,在我发现有一个multiprocessing.set_executable(r"C:\Python64\Python.exe") -
也许您可以使用this answer 中所示的命名管道来回答有关它们的问题。