Я пытаюсь протестировать пример на здесь , изменив его с многопоточности на многопоточность.
При запуске этого (оригинального примера) в блокноте jupyter отобразится индикатор выполнения, который заполняется внекоторое время.
import threading
from IPython.display import display
import ipywidgets as widgets
import time
progress = widgets.FloatProgress(value=0.0, min=0.0, max=1.0)
def work(progress):
total = 100
for i in range(total):
time.sleep(0.2)
progress.value = float(i+1)/total
thread = threading.Thread(target=work, args=(progress,))
display(progress)
thread.start()
Если я изменю код на многопроцессорность, появится индикатор выполнения, но он не заполняется:
import multiprocessing as mp
from IPython.display import display
import ipywidgets as widgets
import time
progress = widgets.FloatProgress(value=0.0, min=0.0, max=1.0)
def work(progress):
total = 100
for i in range(total):
time.sleep(0.2)
progress.value = float(i+1)/total
p = mp.Process(target = work, args=(progress,))
display(progress)
p.start()
Если я изменю вышеприведенное, добавив print(i)
в рабочем цикле индикатор выполнения волшебным образом начинает заполняться.
import multiprocessing as mp
from IPython.display import display
import ipywidgets as widgets
import time
progress = widgets.FloatProgress(value=0.0, min=0.0, max=1.0)
def work(progress):
total = 100
for i in range(total):
print(i)
time.sleep(0.2)
progress.value = float(i+1)/total
p = mp.Process(target = work, args=(progress,))
display(progress)
p.start()
Это ошибка или есть что-то фундаментальное, чего я здесь не вижу?
Редактировать (информация о системе)
ОС Ubuntu 18.04
$jupyter --version
4.4.0
import sys; sys.version
3.7.0 (default, Oct 15 2018, 10:26:13) \n[GCC 7.3.0]