Python jupyter笔记本中的多处理与线程
我试图在将示例从线程处理更改为多处理时对其进行测试 在jupyter笔记本中运行此(原始示例),将显示一个进度条,该进度条在一段时间内填满Python jupyter笔记本中的多处理与线程,python,multithreading,multiprocessing,jupyter-notebook,Python,Multithreading,Multiprocessing,Jupyter Notebook,我试图在将示例从线程处理更改为多处理时对其进行测试 在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):
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()
如果我通过在workers循环中添加一个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
无法重现您的错误,发生了酸洗错误。您正在运行什么OS/Python版本?
jupyter--version
是4.4.0
和import sys;sys.version
是'3.7.0(默认值,2018年10月15日,10:26:13)\n[GCC 7.3.0]。
操作系统是一个Ubuntu 18.04进程,不像线程那样共享状态。当您作为参数前进到Process时,它会被新创建的进程复制。每个进程都有自己的进度条,而您关心的进程,即主进程中的进程,将永远不会收到更新。为什么在进程中添加一条打印语句会改变进度条的行为?这是我没有看到的。
import sys; sys.version
3.7.0 (default, Oct 15 2018, 10:26:13) \n[GCC 7.3.0]