为什么我的 python 多处理脚本在 Windows 上运行而不在 Linux 上运行?

C. *_*iel 6 python linux multiprocessing visual-studio-code

我已经在 Windows 上成功实现了一个多处理脚本,但同一个脚本在 linux 上启动了一个“运行时错误:已经启动”并停止执行。该脚本由以下“main.py”组成(为了可读性省略了一些部分):

from multiprocessing import freeze_support

if __name__ == '__main__':
    #MULTIPROCESSING STUFF
    freeze_support()

    #DO SOME STUFF

    #Call my multiprocessing-function in other module
    mod2.func(tileTS[0], label, areaconst)
Run Code Online (Sandbox Code Playgroud)

和“mod2.py”模块:

import numpy as np
from multiprocessing import Pool
from functools import partial
import os, time

def func(ts, label, areaconst):
    #SETTING UP/LOADING SOME VARIABLES

    for idx in totImgs:            
        img_ = myList[idx]      

        p = Pool(2)
        result = p.map(  partial(_mp_avg, var1=var1_, img=img_), range(totObjs) ) 

        p.close()
        p.join()

        #MANAGE RESULTING VARIABLES

    return None


def _mp_avg(idx, img, var1):
    num = idx + 1
    arr = img[var1==num]
    if np.isnan(arr).any():
        return np.nan 
    else:
        return np.sum( arr )  
Run Code Online (Sandbox Code Playgroud)

当脚本执行“Pool.map”函数/类(dunno tbh)时会启动此错误。相同的代码在 Windows 上可以完美运行。

我正在使用 Ubuntu 18.04 并从 Visual Studio Code 启动 python 3.6.7 脚本。

编辑:添加了运行时错误的屏幕截图 终端错误信息

C. *_*iel 8

正如@Darkonaut 所指出的,Visual Studio Code 使用 ptvsd 作为调试器,它不是 fork-save(https://github.com/Microsoft/ptvsd/issues/1046#issuecomment-443339930)。由于在 linux 上默认的进程生成方法是“os.fork()”,如果在 VSCode 中执行该脚本将生成一个 RuntimeError。这不会发生在 Windows 上。Linux 上的解决方案是:

  • 通过在 main 函数调用后插入以下行来更改 start-method:

    multiprocessing.set_start_method("spawn")
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用 VSCode 编辑代码并从终端启动。

  • 换个IDE。

  • 等待 fork-save 调试器更新,据说它正在工作中。

检查以下链接以获取有关该问题的更多信息:https : //docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods