Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Работа с пулом процессов приводит к зависанию в Jupyter Notebook

#python #python_3x #jupyter_notebook


Подскажите, как реализовать многопоточность в Jupyter Notebook. Например, я хочу
обработать некоторые данные, и записать результат в массив или в файл.

Делаю например так: 

def test_this(elem, test_list):
    test_list.append(elem)

procs = []
test_list = []
for elem in ["one", "two", "tree"]:
    proc = Process(target=test_this, args=(elem,test_list))
    procs.append(proc)
    proc.start()

for proc in procs:
    proc.join()


test_list получается пустой

делаю вот так: 

with Pool(20) as p:
    p.map(test_this, ["one", "two", "tree"])


ячейка зависает навечно.

Что я делаю не так?
    


Ответы

Ответ 1



Чтобы обойти известные проблемы с multiprocessing.Pool в интерактивном случае (таком как работа в jupyter notebook), можно использовать multiprocess модуль: #!/usr/bin/env python3 # from multiprocessing import Pool, set_start_method # hangs on Windows and/or with spawn, forkserver methods from multiprocess import Pool, set_start_method #! pip install multiprocess def double(s): return s*2 if __name__ == "__main__": # set_start_method('fork') # works # set_start_method('spawn') # XXX hangs with stdlib multiprocessing # set_start_method('forkserver') #XXX hangs with stdlib multiprocessing with Pool() as pool: print(*pool.map(double, ["one", "two", "tree"])) Чтобы заработал пример с stdlib multiprocessing, необходимо double функцию сделать pickable, к примеру, поместив её в отдельный модуль (см. Jupyter notebook never finishes processing using multiprocessing (Python 3)): #!/usr/bin/env python3 from multiprocessing import Pool, set_start_method from mp_functions import double if __name__ == "__main__": with Pool() as pool: print(*pool.map(double, ["one", "two", "tree"])) Первый пример с multiprocess вероятно работает так как он использует dill вместо pickle для сериализации.

Комментариев нет:

Отправить комментарий