Почему мой многопроцессорный скрипт python работает в Windows, но не в Linux? - PullRequest
2 голосов
/ 10 апреля 2019

Я успешно реализовал многопроцессорный скрипт в Windows, но тот же скрипт запускает «RuntimeError: уже запущен» в 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)

и модуля "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» (не знаю).Тот же код работает безупречно в Windows.

Я использую Ubuntu 18.04 и запускаю скрипт python 3.6.7 из кода Visual Studio.

EDIT: добавлен снимок экрана с ошибками во время выполнения Terminal Error message

1 Ответ

2 голосов
/ 12 апреля 2019

Как отмечает @Darkonaut, Visual Studio Code использует ptvsd в качестве отладчика, который не является сохранением ветвления (https://github.com/Microsoft/ptvsd/issues/1046#issuecomment-443339930). * Так как в linux по умолчанию используется метод порождения процесса "os.fork ()",Скрипт сгенерирует RuntimeError, если выполняется из VSCode. Этого не произойдет в Windows. Решения в Linux:

  • Измените метод запуска, вставив один раз следующую строку после вызова основной функции:

    multiprocessing.set_start_method("spawn")
    
  • Редактирование кода с помощью VSCode и запуск с терминала.

  • Смена IDE.

  • Дождитесь обновления отладчика fork-save, которое предположительно находится в работе.

Проверьте следующую ссылку для получения дополнительной информации о проблеме: https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods

...