【问题标题】:a Python script in 32 bit invoking multiprocessing running in 64 bit virtualenv32 位 Python 脚本调用在 64 位 virtualenv 中运行的多处理
【发布时间】:2018-10-21 19:34:36
【问题描述】:

我需要在 32 位系统范围内运行 Python 脚本以通过第三方应用程序生成/收集数据。但是我想通过numba使用GPU处理数据,所以它必须在64位Python环境中运行。

我已经设置了一个 64 位 Python virtualenv,并测试了一些在其中运行良好的简单 numba 代码。那么我应该如何在父进程中编写代码来调用子进程(multiprocessingsubprocess 我假设)将切换到 64 位 virtualenv 并使用 numba 进行计算?更具体地说:

  1. 我应该使用multiprocessingsubprocess来实现父(32位Python)和子进程(64位Python)机制吗?
  2. 如何在父子进程之间传递大量数据?

可能的代码示例:

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() 的好方法。似乎数据必须通过stdinstdout。我最终使用了multiprocessing,在我发现有一个multiprocessing.set_executable(r"C:\Python64\Python.exe")
  • 也许您可以使用this answer 中所示的命名管道来回答有关它们的问题。

标签: python multiprocessing


【解决方案1】:

我看到了这个问题Spawn multiprocessing.Process under different python executable with own path,并根据我的 Python 版本(2.7.5 32 位、2.7.15 64 位)找到了答案。

def func_32():
    # data collection
    # using 3rd party API
    return data

def func_64(data, output):
    # switch to 64 bit Python
    # not directly calling virtualenv
    # to switch env
    import sys
    print sys.executable
    # will print  C:\Python64\Python.exe
    # numba data process
    # results stored in output
    return None

def main():
    data = func_32()
    multiprocessing.set_executable(r'C:\Python64\python.exe')
    p = multiprocessing.Process(target=func_64, args=(data, output))
    p.start()
    p.join()
    return output

但为了在该虚拟环境中使用 64 位 Python 包,我最终主要从 activate_this.py(位于 virtualenv 文件夹中)复制代码,以更改 Python 搜索路径等。请参阅我的答案Spawn multiprocessing.Process under different python executable with own path.

我认为使用multiprocessing 为我提供了在父进程和子进程之间传递数据的更方便的方式,尤其是大量数据。

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 2020-03-22
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多