Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python jupyter笔记本中的多处理与线程_Python_Multithreading_Multiprocessing_Jupyter Notebook - Fatal编程技术网

Python 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):

我试图在将示例从线程处理更改为多处理时对其进行测试

在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()
如果我通过在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]