Python 回调函数实现异步处理

2023-11-02

说到异步处理大家应该会联想到Ajax 处理,那我们先来说说什么是Ajax 请求。

 

Ajax 就相当于是模拟了一个信息发送请求,你可以在很多网站上注册的时候会发现,比如用户名输入“123”,那么它可能会提示你该用户已经存在,而给你的感觉是页面并没刷新,也就是并没有提交表单,而用户名又是存放在数据库内的,也就是说要查询用户名是否存在,就必须得发送表单的里的用户名,然后再在数据库中去查询。

 

而这个过程就是用了Ajax 来处理的,用户输入用户名,当表单的焦点发生变化的时候,则会触发Ajax,然后Ajax 发送一个GET或者POST请求给服务器,服务器就会处理传递过来的数据!

今天给大家分享的是在Python 里面通过回调函数来实现异步的处理。

 

示例代码如下所示:

import threading
import time
import datetime

#第一个请求
def request_1():
    print("the request 1 is start")
    io(callback)
    print("the request 1 is end")

#第二个请求
def request_2():
    print("the request 2 is start")
    time.sleep(2)
    print("the request 2 is end")

#获取数据请求类的操作,如:从db读取数据,循环耗时,调用其他api等
def io(callback):
    def run(call):
        print("the run is start")
        time.sleep(5)
        print("the run is end")
        conn_db=[x for x in range(10000)] #模拟从db获取数据
        call(conn_db)
    # 这里是启动一个线程去处理这个io操作,不用阻塞程序的处理
    threading.Thread(target=run,args=(callback,)).start()

#回调函数
def callback(data):
    print("the callback is start")
    print("the response of callback is:",data)
    print("the callback is end")

if __name__ == '__main__':
    start_time=datetime.datetime.now()
    request_1()
    request_2()
    end_time=datetime.datetime.now()
    #这里是在统计总耗时,从打印的结果可以看到是异步处理的。
    print("the spend of total time is:",(end_time-start_time).seconds)

输出内容如下:

the request 1 is start
the run is start
the request 1 is end
the request 2 is start
the request 2 is end
the spend of total time is: 2
the run is end
the callback is start
the response of callback is:[0, 1,...]
the callback is end

Process finished with exit code 0

总结:

异常的处理就是在我们需要等待一个io 耗时处理时,可以不用排队等待而去做其他的可以处理的事情,这样就提高了系统的处理效率,这对于一个系统来说是非常重要的。

欢迎关注【无量测试之道】公众号,回复【领取资源】,
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

 添加关注,让我们一起共同成长!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 回调函数实现异步处理 的相关文章

  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 一些比较不错的资源网站

    阮一峰日志地址 Github上值得推荐的开源电子书
  • QT 5.15 源码windows下 msvc编译

    目录 1 下载 Qt 源代码 2 安装依赖项 3 配置命令行环境变量 4 构建 5 使用 1 下载 Qt 源代码 Index of archive qt 5 15 5 15 8 singlehttps download qt io arch
  • STM32F4XX/APM32F4XX USB OTA升级

    近期在研究USB CDC协议 使用USB Virtual Port Com功能与上位机通讯做了OTA功能 开发平台 MDK529开发硬件 APM32F411首先介绍一下程序执行逻辑 程序由两部分组成 Boot APP Flash由三部分组成
  • 485串口服务器协议,10/100M TCP/IP转1口RS-232/485/422串口服务器 - 宇泰(UTEK) - 全球领先智能通讯解决方案提供商!...

    gt gt 硬件特性 菜单配置界面 操作模式丰富 满足不同行业的应用 提供Windows 虚拟COM 驱动软件 灵活合理的UNIX 下Fixedtty 工作机制 具有1个串行端口 可以连接终端 Modem 条码机 收款机 ISDN 终端适配
  • 《网页设计基础——CSS的四种引入方式详解》

    网页设计基础 CSS的四种引入方式详解 一 行内式 规则 1 行内式是所有样式方法中最为直接的一种 它直接对HTML的标记使用style属性 然后将CSS代码直接写在其中 格式 p style color FF0000 font size
  • 用「渣男」心态去面试,爽翻!

    转载自博学谷公众号 面试是一场 销售 自己的考试 很多程序员掌握的技术 知识都非常过关 但在面试中却不能完全展现出来 屡屡发挥失常 同样是天选打工人 别人的offer 像猴子摘苞谷 应接不暇 而你的offer 像肉包子打狗 有去无回 究其根
  • python的环境变量配置

    一般会自己在安装时配置环境变量 但是也有小失误忘了打勾勾 这时我们则需要自己配置环境变量 Python的环境变量配置很简单 1 1 Windows配置环境变量 右击点击 我的电脑 点击 属性 2在弹出的界面中点击 高级系统设置 不同的win
  • 《MySQL实战45讲》——学习笔记33 MySQL Server查询结果的发送流程 / 一次查询大量数据对innoDB bufferPool的影响 / 内存淘汰算法LRU与innoDB改进的LRU

    本篇通过 大查询会不会把内存用光 这个问题 介绍了MySQL 的查询结果发送给客户端的过程 涉及的知识点包括 MySQL Server查询结果的发送流程 边读边发 MySQL线程状态Sending to client Sending dat
  • 面试题:软件测试工程师工作职责?

    软件测试工程师工作职责 工作职责 测试人员有不同的级别 或者说有不同的职位称呼 都有相对应不同的工作职责 如果你想了解现在企业里面最新的职位需求的话 最简单的一个方式就是直接去大型招聘网站上BOSS直聘或者前程无忧 赶集网去搜索软件测试工程
  • 前端表单验证 for循环验证 自定义表单验证

  • 关于Java的那些安全框架

    前言 在Java开发中 安全是一项至关重要的特性 不仅仅是因为它保护我们的数据和系统免受恶意攻击 还因为它保护着我们和我们的用户的隐私 因此 Java安全框架的选择至关重要 在本篇博客中 我们将探讨一些常见的Java安全框架 以及如何使用它
  • 微服务发展趋势

    目录 云原生网关逐步成型 服务网格回归理性 微服务架构分层逐渐清晰 微服务技术标准逐步形成 数据面 SidecarProxy 与 Proxyless 模式的融合 服务治理数据面透明化 控制面标准化 分布式事务从多样化到标准化 多语言解决方案
  • Android混合开发全解析

    现在的app都开始流行混合开发了 这是一个app开发的新技术 作为android程序猿的我们也应该要了解并且掌握他 那么在使用之前 我们一定要搞清楚 我们的哪些场景使用混合开发好一些呢 这个问题一定要搞清楚 因为现在的混合开发还不成熟 We
  • 测开基础知识02

    1 软件测试 软件测试 软件测试是软件研发的一部分 不止是找出软件错误的活动 是软件开发每一环节中一些列质量活动的总称 包括软件研发过程的改进 软件质量评定 需要参与到每一环关键的决策 发现程序中的错误 根据需求 分析执行软件的全过程 保证
  • lol英雄全皮肤爬取

    如何实现英雄联盟全皮肤 作为英雄联盟资深老玩家 想必大家都希望自己能拥有一套全皮肤 那么今天 小编就带着大家用网络爬虫的方式 爬取一套属于自己的全皮肤 冲 第一步 首先 打开我们全皮肤所在的网站 https 101 qq com hero
  • c#和c++的opencv位图数据参数互换问题解决方法

    1 C 调用vc dll 传递参数的问题 Bitmap 转换为 opencv mat 保存后图片不一样 vc 代码 bool Recognize Point 2F arr uchar b Mat src cv Mat 415 770 CV
  • 网络基础:网络协议及数据报格式

    网络应用程序设计模式 网络分层模型 两台计算机通过TCP IP协议通讯过程 协议格式 以太网帧格式 ARP探测的概念及数据报格式 ip段格式 UDP数据报格式 TCP数据报格式 TCP IP数据包封装 NAT映射与打洞机制 概念说明
  • 6950有史以来最经典玩机宝典/软件包/导航

    http www diypda com forum php mod viewthread tid 116274 教程 6950有史以来最经典玩机宝典 软件包 导航 复制链接 新支点6950玩机宝典 作为论坛资深认证商家和6950的改卡开发商
  • Linux进程

    目录 进程基本概念 描述进程PCB task struct内容分类 通过系统调用创建进程 fork 进程状态 Z zombie 僵尸进程 孤儿进程 进程优先级 进程基本概念 书上的概念是 进程是程序的一个执行实例 正在执行的程序等 在内核的
  • Python 回调函数实现异步处理

    说到异步处理大家应该会联想到Ajax 处理 那我们先来说说什么是Ajax 请求 Ajax 就相当于是模拟了一个信息发送请求 你可以在很多网站上注册的时候会发现 比如用户名输入 123 那么它可能会提示你该用户已经存在 而给你的感觉是页面并没