【发布时间】:2021-11-07 13:11:59
【问题描述】:
我正在使用 Dash 开发一种特定类型的应用程序,它需要通过按下按钮执行的操作在单独的进程中执行。反过来,这个过程是可并行的,并且在某些情况下会产生子进程以进行高效计算。在这种情况下给出的配置会使子进程卡住。下面的代码重现了如下描述的情况:
import multiprocessing
import time
import dash
from dash import html
from dash.dependencies import Input, Output
app = dash.Dash(__name__)
app.layout = html.Div([
html.Button(id='refresh-button', children='Button'),
html.Div(id='dynamic-container1')
])
def run_function(i):
print('hello')
time.sleep(15)
print(f'hello world {i}')
def run_process():
num = 1
print('hello world 00000')
process = multiprocessing.Process(target=run_function, args=(num,))
process.start()
process.join()
print('hello world')
@app.callback(Output('dynamic-container1', 'children'), Input('refresh-button', 'n_clicks'))
def refresh_state(click):
if click == 0 or click is None:
return None
p = multiprocessing.Process(target=run_process)
p.start()
p.join()
return None
if __name__ == '__main__':
app.run_server(debug=True)
按下按钮时此应用程序的输出始终如下:
Connected to pydev debugger (build 172.3968.37)
Dash is running on http://127.0.0.1:8050/
* Serving Flask app 'main' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
pydev debugger: process 6884 is connecting
hello world 00000
这意味着使用函数run_process()的第一个进程已经启动,但是子进程run_function(i)甚至没有启动。我试图在有关 Python 中的多处理的流行书籍中找到解释以及对这些“链接”过程的任何指导,但无济于事。据我了解,新的子进程run_function(i)应该占用一个单独的核心(如果有空闲核心),而不是依赖父进程run_process()消耗的资源。请你给我解释一下这个机制?我怀疑在这段代码中run_function(i) 可能会被强制消耗与run_process() 相同的资源,所以系统基本上只是限制任何新进程从相同的资源开始,但我想从更多的 Python 专家用户。
我在 Win7 上使用 Python 3.7 和 Pycharm Community 2017.2.3 重现了这个例子
【问题讨论】:
标签: python python-multiprocessing plotly-dash