Устранение неполадок в процессе обработки, когда функция имеет глобальное состояние в импортированных библиотеках. - PullRequest
0 голосов
/ 06 июня 2018

Это делается на примере машинного обучения, но я не верю, что проблема или решение конкретно связаны с ним с использованием keras / tenorflow.

__init__.py файл с каким-то глобальным состоянием, которое я не могуобойтись ...

## Silly module with some odd state variables

global __STATE
__STATE = 3

def add(x):
    if __STATE == 3:
        return x + __STATE
    else:
        return 0

def finish():
    global __STATE
    __STATE = None
    del __STATE
    return 

Многопроцессорный код Я хочу получить работу

def doSomethingComplicated(x):

    # x = x + y
    # import some libraries
    import stateFullStuff 
    # create some of its own processes and run them
    x = stateFullStuff.add(x)
    print (x)
    stateFullStuff.finish()
    # print ("finished")
    return x

from multiprocessing import Pool

if __name__ == '__main__':

    x_ = range(100)
    pool = Pool(3)
    results = pool.map(doSomethingComplicated,x_)
    print ("results: ", results)

Теперь это работает нормально, если число работников в пуле равно или больше, чем len (х_) но это недопустимо.Для всеобщего интереса глобальное состояние, вызывающее проблемы в моем реальном коде, - это загруженный бэкэнд тензорного потока в Keras.Я полагаю, что сессия закрыта, когда задача выполнена, но следующая задача для некоторого работника все еще видит старую сессию ...

1 Ответ

0 голосов
/ 06 июня 2018

multiprocessing внутренне работает, запуская экземпляры Python и выполняя вашу функцию.глобальное состояние не разделяется вообще.глобальный код (внешние функции) выполняется снова, так как каждый модуль загружается в новый экземпляр.Если вам нужно глобальное состояние в multiprocessing, вы должны сохранить его в основном процессе и использовать некоторую форму связи, например отображение общей памяти.См. multiprocessing документы здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...