我已经在Windows上成功实现了多进程脚本,但是同一脚本在Linux上启动了“ RuntimeError:已经启动”并停止了执行。 该脚本由以下“ 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)
和“ 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 )
当脚本执行“ Pool.map”函数/类(dunno tbh)时,将启动此错误。相同的代码在Windows上可以完美运行。
我正在使用Ubuntu 18.04,并从Visual Studio Code启动python 3.6.7脚本。
答案 0 :(得分:1)
正如@Darkonaut所指出的那样,Visual Studio Code使用ptvsd作为调试器,而不是进行分叉保存(https://github.com/Microsoft/ptvsd/issues/1046#issuecomment-443339930)。 由于在Linux上,默认的进程生成方法是“ os.fork()”,因此,如果从VSCode中执行该脚本,则会生成RuntimeError。在Windows上不会发生这种情况。 Linux上的解决方案是:
通过在主函数调用后的以下行插入一次来更改启动方法:
multiprocessing.set_start_method("spawn")
使用VSCode编辑代码并从终端启动。
更改IDE。
等待分叉保存调试器更新,该更新可能正在工作中。
检查以下链接以获取有关该问题的更多信息: https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods