更多Dash应用开发干货知识、案例,欢迎关注“玩转Dash”微信公众号

大家好我是费老师,在前两期文章中,我们针对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学习”加入我们的技术交流群,一起成长一起进步。

Python全栈应用开发利器Dash 3.x新版本介绍(3)的更多相关文章

  1. 【Python全栈-后端开发】嵩天老师-Django

    嵩天老师-Python云端系统开发入门教程(Django) 视频地址:https://www.bilibili.com/video/av19801429 课前知识储备: 一.课程介绍: 分久必合.合久 ...

  2. 【Python全栈-后端开发】Django入门基础

    Django基础知识 一. 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的 ...

  3. 【Python全栈-后端开发】Django进阶2-Form表单

    Django进阶2-Form表单 Django的Form主要具有一下几大功能: 生成HTML标签(可以保留上次输入内容) 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页 ...

  4. 读后笔记 -- Python 全栈测试开发 Chapter10:接口的设计与开发

    10.1 Django 框架 1. 几个主流的框架: 1)适合初学者的接口框架:Django,Flask 2)针对底层定义:Twisted 3)实现高并发:Tornado 2. install // ...

  5. 【Python全栈-后端开发】Django进阶之Model操作复习

    Django进阶之Model操作复习 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - ...

  6. 【Python全栈-后端开发】数据库进阶

    数据库进阶 python关于mysql的API---pymysql模块 pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 模块安装 pip install ...

  7. 读后笔记 -- Python 全栈测试开发 Chapter11:Python + Requests 实现接口测试

    11.1 Requests 框架 11.1.1 requests 请求 1. reqeusts 库 安装 pip install requests 2. requests 库 GET 方法,参数通过 ...

  8. 读后笔记 -- Python 全栈测试开发 Chapter8:接口测试

    8.1 接口测试 1. 市场分布 UI(web.app)自动化:10% 接口自动化:20% 单元测试:70% -- 测开 2. 接口类型: 1)结构划分:模块间(系统间)的接口称为内部接口:系统与第三 ...

  9. 【Python全栈-后端开发】Django进阶1-分页

    Django[进阶篇-1 ]分页 分页 一.Django内置分页 from django.core.paginator import Paginator, EmptyPage, PageNotAnIn ...

  10. 【Python全栈-后端开发】Django入门基础-2

    Django入门基础知识-2 一 .模版 一.模版的组成 HTML代码+逻辑控制代码 二.逻辑控制代码的组成 1  变量(使用双大括号来引用变量) {{var_name}} 2  标签(tag)的使用 ...

随机推荐

  1. C#多线程编程(二)线程池与TPL

    一.直接使用线程的问题 每次都要创建Thread对象,并向操作系统申请创建一个线程,这是需要耗费CPU时间和内存资源的. 无法直接获取线程函数返回值 无法直接捕捉线程函数内发生的异常 使用线程池可以解 ...

  2. Asp.net mvc基础(三)View的查找

    1.指定转到的视图 View("指定的视图名称"); 优先于寻找Action方法名称可以创建的视图的文件夹,如果没有,就去View文件夹下的Shared文件夹寻找指定的视图名称. ...

  3. selenium IDE简单使用

    selenium IDE可理解为录制操作浏览器的过程,然后回放实现UI级的自动化 一,首先安装,本案例主要在谷歌浏览器上使用,所以用的是支持谷歌的IDE文件 下载,打开https://www.crx4 ...

  4. DPDI(Dispatch PDI)kettle调度管理平台升级内容

    DPDI升级内容(20240815版) DPDI online部署方式 定时任务优化(支持轮询机制,Cron可提示近5次运行时间) 运行任务优化(支持多机器分布式运行) 其它小功能优化 1. 首页可手 ...

  5. 关于Cesium渲染PrimitiveCollection和图层的树状管理的问题

    原文:关于Cesium渲染PrimitiveCollection和图层的树状管理的问题 - 搜栈网 (seekstack.cn)

  6. Vue(六)——条件渲染

    Vue--条件渲染 v-if.v-else-if.v-else v-if 指令用于条件性地渲染一块内容,表达式的值为 true --渲染. false--不渲染 v-if.v-else-if.v-el ...

  7. coreybutler/nvm-windows 简单使用

    目录 nvm是什么 安装 简单命令 nvm是什么 Windows电脑node.js管理器.可以方便node.js的安装与切换. 最新版本1.1.11 coreybutler/nvm-windows 有 ...

  8. Java编程--抽象类和接口的区别

    No. 区别 抽象类 接口 1 关键字 abstract class interface 2 组成 构造方法.普通方法.抽象方法.static方法.常量.变量 抽象方法.全局常量 3 子类使用 cla ...

  9. 代码随想录第十六天 | Leecode 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树

    Leecode 513. 找树左下角的值 题目描述 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值. 假设二叉树中至少有一个节点. 示例 1: 输入: root = [ ...

  10. 【经验】WakeUp、Outlook、Google日历导入飞书日历

    以飞书团队账号登录时,设置的日历就能被团队其他成员看到(可选择私密.仅忙碌[默认].完全公开三种模式),以便相互查看空闲时间. Wakeup日历导出到Outlook日历 Wakeup支持从各大学校便利 ...