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