
大家好我是费老师,在前两期文章中,我们针对Python生态中强大且灵活的全栈应用开发框架Dash,介绍了其3.x新版本中的部分更新内容🧐:
而今天的文章中,我们将继续介绍Dash3.x新版本中的其他重磅💥新功能,今天要介绍的是新版本中对异步编程的新增支持。

Dash应用开发新增异步编程支持
从3.1.0版本开始,得益于底层依赖的Flask当前对异步编程较为稳定的支持,在Dash中我们可以编写异步函数形式的服务端回调函数。终端执行下面的命令,即可完成额外异步依赖的安装:
pip install dash[async] -U
对于了解Python异步编程的朋友,可以将应用中相关的计算场景轻松改造为异步形式,从而大幅度降低计算耗时,下面我们举例演示:
异步形式的回调函数
针对服务端回调函数场景,为了进行直观对比,我们先来看一个同步写法下的示例应用:
import time import dash import random from dash import html import feffery_antd_components as fac from dash.dependencies import Input, Output from feffery_dash_utils.style_utils import style app = dash.Dash(__name__) app.layout = html.Div( [ fac.AntdSpace( [ fac.AntdButton( "执行计算", id="execute", type="primary", loadingChildren="计算中", ), fac.AntdText(id="result"), ] ) ], style=style(padding=50), ) def job(): time.sleep(1) return random.randint(0, 100) @app.callback( Output("result", "children"), Input("execute", "nClicks"), running=[[Input("execute", "loading"), True, False]], prevent_initial_call=True, ) def sync_callback_demo(nClicks): start = time.time() # 模拟耗时计算任务过程 results = [job() for _ in range(5)] return f"本次计算结果:{results}, 计算耗时:{round(time.time() - start, 2)} 秒" if __name__ == "__main__": app.run(debug=True)
在对应的回调函数sync_callback_demo()中,我们调用了5次具有一定模拟计算耗时的job()函数,因此每次点击按钮执行计算后,都要耗时约5秒:

而在3.1.0版本之后的Dash中,我们可以使用Python中的异步编程相关写法,编写异步形式的回调函数,与前面同步形式示例做对比,异步形式示例代码如下:
import time import dash import random import asyncio from dash import html import feffery_antd_components as fac from dash.dependencies import Input, Output from feffery_dash_utils.style_utils import style app = dash.Dash(__name__) app.layout = html.Div( [ fac.AntdSpace( [ fac.AntdButton( "执行计算", id="execute", type="primary", loadingChildren="计算中", ), fac.AntdText(id="result"), ] ) ], style=style(padding=50), ) async def async_job(): await asyncio.sleep(1) return random.randint(0, 100) @app.callback( Output("result", "children"), Input("execute", "nClicks"), running=[[Input("execute", "loading"), True, False]], prevent_initial_call=True, ) async def async_callback_demo(nClicks): start = time.time() # 模拟耗时计算任务过程 coros = [async_job() for _ in range(5)] results = await asyncio.gather(*coros) return f"本次计算结果:{results}, 计算耗时:{round(time.time() - start, 2)} 秒" if __name__ == "__main__": app.run(debug=True)
因为利用asyncio.gather()进行多个异步函数的整合执行,所以同样的计算操作,耗时得到有效降低,只需要约1秒:

基于这项新特性,我们就可以在相关场景下进行有效的异步改造,从而提升计算效率⚡。
篇幅有限,更多新版本Dash更新相关内容,接下来的数篇文章我们继续为大家盘点,敬请期待~
以上就是本文的全部内容,对Dash应用开发感兴趣的朋友,欢迎添加微信号CNFeffery,备注“dash学习”加入我们的技术交流群,一起成长一起进步。