#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 для сериализации.
Комментариев нет:
Отправить комментарий