当前位置: 首页 > news >正文

python3协程学习-async,await

参考文档:

https://cloud.tencent.com/developer/article/2002528

https://cloud.tencent.com/developer/article/2480588?policyId=1004

什么是协程

https://docs.python.org/3.11/glossary.html#term-coroutine

协程:Coroutines are a more generalized form of subroutines. Subroutines are entered at one point and exited at another point. Coroutines can be entered, exited, and resumed at many different points. They can be implemented with the async def statement. See also PEP 492.  协程是一种更通用的子进程形式,子进程就是从一点进入(调用)到退出(返回结果),协程可以在不同的点进入和退出并恢复。使用async def语句实现。

协程函数: A function which returns a coroutine object. 返回一个协程对象的函数

洗衣机例子:

多线程:
假设有1个洗衣房,里面有10台洗衣机,有一个洗衣工在负责这10台洗衣机。那么洗衣房就相当于1个进程,洗衣工就相当1个线程。如果有10个洗衣工,就相当于10个线程,1个进程是可以开多线程的。
那么协程呢? 先不急。大家都知道,洗衣机洗衣服是需要等待时间的,如果10个洗衣工,1人负责1台洗衣机,这样效率肯定会提高,但是不觉得浪费资源吗?明明1个人能做的事,却要10个人来做。
只是把衣服放进去,打开开关,就没事做了,等衣服洗好再拿出来就可以了。就算很多人来洗衣服,1个人也足以应付了,开好第一台洗衣机,在等待的时候去开第二台洗衣机,再开第三台,……直到有衣服洗好了,就回来把衣服取出来, 接着再取另一台的(哪台洗好先就取哪台,所以协程是无序的)。这就是计算机的协程!洗衣机就是执行的方法。”

协程,又称微线程。 协程的作用是在执行函数A时可以随时中断去执行函数B,然后中断函数B继续执行函数A(可以自由切换)。 但这一过程并不是函数调用,这一整个过程看似像多线程,然而协程只有一个线程执行。

协程很适合处理IO密集型程序的效率问题。协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,因此对于CPU密集型程序协程需要和多进程配合。

 https://docs.python.org/3.11/glossary.html#term-coroutine
 

同步和异步

 

async/await

async: 当函数被 async 关键字修饰后,调用该函数不会直接执行函数体,而是返回一个协程对象

await: Suspend the execution of coroutine on an awaitable object. Can only be used inside a coroutine function. https://peps.python.org/pep-0492/#await-expression, 仅可以使用在协程函数中,等待一个可等待对象执行完。

await 后面必须要是一个可等待对象

  • await + 可等待对象(协程对象,Future,Task对象(IO等待))
  • 等待到对象的返回结果,才会继续执行后续代码
错误等待会报错
    await time.sleep(2)  # 第一台洗衣机,
TypeError: object NoneType can't be used in 'await' expression

  

 

单线程执行

所有函数都是串行调用。

 

import timedef washing1():print('washer1 start at {}'.format(time.time()))time.sleep(2)  # 第一台洗衣机,print('washer1 finished at {}'.format(time.time()))  # 洗完了def washing2():print('washer2 start at {}'.format(time.time()))time.sleep(3)print('washer2 finished at {}'.format(time.time()))def washing3():print('washer3 start at {}'.format(time.time()))time.sleep(6)print('washer3 finished at {}'.format(time.time()))if __name__ == '__main__':start_time = time.time()print("main start at {}".format(time.time()))washing1()washing2()washing3()print("main finished at {}".format(time.time()))end_time = time.time()print('总共耗时:{}'.format(end_time-start_time))

# 可以看到总耗时 2 + 3 + 6 = 11 秒 # main start at 1757666672.326777 # washer1 start at 1757666672.3268082 # washer1 finished at 1757666674.328899 # washer2 start at 1757666674.3289628 # washer2 finished at 1757666677.3320591 # washer3 start at 1757666677.3321292 # washer3 finished at 1757666683.3382258 # main finished at 1757666683.3382993 # 总共耗时:11.01153826713562

  

 协程(异步)

协程(coroutines)通过async/await语法进行声明,通过async装饰了的函数不能直接执行,因为函数此时返回的是一个协程对象。

import timeasync def washer1():time.sleep(3)  # 第一台洗衣机,print('washer1 finished')  # 洗完了res = washer1()
print(res)   # <coroutine object washer1 at 0x7f0b1918b0d0>

 

协程需要asyncio去执行

import time
import asyncio
async def washer1():print('washer1 start at {}'.format(time.time()))time.sleep(2) print('washer1 finished at {}'.format(time.time())) # 洗完了if __name__ == '__main__':res = washer1()asyncio.run(res)print(res) # <coroutine object washer1 at 0x7f0b1918b0d0> # washer1 start at 1757667121.1676168 # washer1 finished at 1757667123.169721 # <coroutine object washer1 at 0x7f7f7591b140>

  

在上面的例子中只执行了一个任务,所以没有看出协程的优势,尝试执行多个任务。

import time
import asyncioasync def washing1():print('washer1 start at {}'.format(time.time()))time.sleep(2)  # 第一台洗衣机,print('washer1 finished at {}'.format(time.time()))  # 洗完了async def washing2():print('washer2 start at {}'.format(time.time()))time.sleep(3)print('washer2 finished at {}'.format(time.time()))async def washing3():print('washer3 start at {}'.format(time.time()))time.sleep(6)print('washer3 finished at {}'.format(time.time()))async def main():start_time = time.time()print("main start at {}".format(time.time()))# task1 = asyncio.create_task(washing1())# task2 = asyncio.create_task(washing2())# task3 = asyncio.create_task(washing3())# await task1# await task2# await task3# 多个任务的时候如下优化loop = asyncio.get_running_loop()tasks = [loop.create_task(washing1()), loop.create_task(washing2()), loop.create_task(washing3())]await asyncio.gather(*tasks)# tasks = [washing1(),washing2(),washing3()]   # fixme why? # loop.run_until_complete(asyncio.wait(tasks))print("main finished at {}".format(time.time()))  # fixme why?end_time = time.time()print('总共耗时:{}'.format(end_time-start_time))if __name__ == '__main__':asyncio.run(main())
# main start at 1757668470.8842885
# washer1 start at 1757668470.8843513
# washer1 finished at 1757668472.8861766
# washer2 start at 1757668472.8862946
# washer2 finished at 1757668475.8894012
# washer3 start at 1757668475.8895106
# washer3 finished at 1757668481.8956199
# main finished at 1757668481.8958285
# 总共耗时:11.011565685272217

  

这里采用了异步执行,仍然使用了11s,这个是因为time.sleep是阻塞式的,并没有释放线程的控制权(不够准确),所以函数仍然串行执行完了。替换time.sleep 为asyncio.sleep(2)

import time
import asyncioasync def washing1():print('washer1 start at {}'.format(time.time()))# time.sleep(2)  # 第一台洗衣机,  await不能等待time,会在回调的时候报错await asyncio.sleep(2)print('washer1 finished at {}'.format(time.time()))  # 洗完了async def washing2():print('washer2 start at {}'.format(time.time()))await asyncio.sleep(3)print('washer2 finished at {}'.format(time.time()))async def washing3():print('washer3 start at {}'.format(time.time()))await asyncio.sleep(6)print('washer3 finished at {}'.format(time.time()))async def main():start_time = time.time()print("main start at {}".format(time.time()))# 多个任务的时候如下优化loop = asyncio.get_running_loop()tasks = [loop.create_task(washing1()), loop.create_task(washing2()), loop.create_task(washing3())]await asyncio.gather(*tasks)# tasks = [washing1(),washing2(),washing3()]   # fixme why? # loop.run_until_complete(asyncio.wait(tasks))print("main finished at {}".format(time.time()))  # fixme why?end_time = time.time()print('总共耗时:{}'.format(end_time-start_time))if __name__ == '__main__':asyncio.run(main())
# main start at 1757668647.4589832
# washer1 start at 1757668647.4590447
# washer2 start at 1757668647.4590783
# washer3 start at 1757668647.4591055
# washer1 finished at 1757668649.4613025
# washer2 finished at 1757668650.4606535
# washer3 finished at 1757668653.462307
# main finished at 1757668653.462472
# 总共耗时:6.00351619720459

 

再看下更复杂的场景,我们把洗衣服拆分为 洗衣服和加衣服进去的两个动作,假如我们使用两个洗衣机同时洗衣服和袜子。看下效果

import time
import asyncioasync def add_stocks():print('get_stocks start at {}'.format(time.time()))await asyncio.sleep(2)print('get_stocks finished at {}'.format(time.time()))async def add_clothes():print('add_clothes start at {}'.format(time.time()))await asyncio.sleep(3)print('add_clothes finished at {}'.format(time.time()))async def washing_stocks():print('washer1 add_stocks start at {}'.format(time.time()))await add_stocks()print('washer1 add_stocks finished at {} and start washing'.format(time.time()))# time.sleep(2)  # 第一台洗衣机,await asyncio.sleep(2)print('washer1 finished at {}'.format(time.time()))  # 洗完了async def washing2():print('washer2 add_clothes start at {}'.format(time.time()))await add_clothes()print('washer2 add_clothes finished at {} and start washing'.format(time.time()))await asyncio.sleep(3)print('washer2 finished at {}'.format(time.time()))async def main():start_time = time.time()print("main start at {}".format(time.time()))# 多个任务的时候如下优化loop = asyncio.get_running_loop()tasks = [loop.create_task(washing_stocks()), loop.create_task(washing2())]await asyncio.gather(*tasks)print("main finished at {}".format(time.time())) end_time = time.time()print('总共耗时:{}'.format(end_time-start_time))if __name__ == '__main__':asyncio.run(main())
# main start at 1757669126.4952745
# washer1 add_stocks start at 1757669126.4953442
# get_stocks start at 1757669126.4953556
# washer2 add_clothes start at 1757669126.4953816  
# add_clothes start at 1757669126.4953878   # 这里可以看到基本都是两个washer基本同时启动,且同时开始加待洗的东西 
# get_stocks finished at 1757669128.4976122  # 第一个加入的要洗的袜子结束(耗时2s)开始洗
# washer1 add_stocks finished at 1757669128.4976714 and start washing
# add_clothes finished at 1757669129.4969563
# washer2 add_clothes finished at 1757669129.4970083 and start washing
# washer1 finished at 1757669130.5003135
# washer2 finished at 1757669132.498279
# main finished at 1757669132.4984148
# 总共耗时:6.0031867027282715  # 总共耗时 3+3 =6

  

https://cloud.tencent.com/developer/article/2480588?policyId=1004

 添加超时

 

 

取消任务

相关文章:

python3协程学习-async,await

参考文档: https://cloud.tencent.com/developer/article/2002528 https://cloud.tencent.com/developer/article/2480588?policyId=1004 什么是协程 https://docs.python.org/3.11/glossary.html#term-coroutine 协程:Coroutines are a more generalized form of subroutin…...

猫树分治

猫树分治,又称二区间合并,一种可以用 \(O(n\log n)\) 时空复杂度预处理,\(O(1)\) 处理区间询问的算法,与 cdq 和整体二分类似。 我们考虑线段树上,我们通过 pushup 操作不断合并两个区间,做到查询 \(O(\log n)\) 个区间回答询问,但是如果没有修改操作,我们可以只询问 \…...

Rust太难了。。。。。。。

rust是我学习过的除汇编之外最难的编程语言,难到什么程度? AI写的都是tm的错误,bug。AI在其他语言上面几乎不可能...

AI导航生成寻路点-FindPathToLocationSynchronously

FindPathToLocationSynchronously() example:FHitResult Hit;if (GetHitResultUnderCursor(ECC_PhysicsBody, false, Hit)){ CacheDestination = Hit.ImpactPoint;}if (UNavigationPath* NavPath = UNavigationSystemV1::FindPathToLocationSynchronously(this, Controll…...

cache写策略

cache写策略 写命中 全写法 当cpu对cache写命中时,必须把数据同时写入cache和主存,一般使用写缓冲 cpu不会一直在写入数据,当cpu去做其他事情的时候,会有一个控制电路,把数据从写缓冲逐一写入到主存 使用写缓冲,cpu写的速度很快,如果写操作不频繁,则效果很好,如果写操…...

个人微信开发

开发微信机器人需要以下几个基本概念:机器人接口开发:框架提供了开放接口,可以通过这些接口对微信进行操作。如接收用户消息、发送消息、操作朋友圈等。 自然语言处理:机器人需要能够理解自然语言,以便能够识别用户输入的意图,并做出相应的回应。自然语言处理包括文本分析…...

C++之std::is_trivially_copyable

在C++11中,平凡类型(Trivial Type)、平凡可复制类型(TrivialCopyable)、标准布局类型(Standard-layout Type) 是描述类在内存中布局特性的术语,它们与类的构造、拷贝、赋值和销毁行为有关,也影响着类的内存布局和对齐方式。 下面用通俗的语言解释这些概念: 平凡类型 …...

PostgreSQL技术大讲堂 - 第104讲:PostgreSQL分区表应用实践

PostgreSQL从入门到精通系列课程,100+节PG技术讲解,让你从小白一步步成长为独当一面的PG专业人员,点击这里查看章节内容,持续更新,欢迎加入。 第104讲:PostgreSQL分区表应用实践--让你速度提高20倍1、什么是基于哈希的分区?2、两级分区介绍3、catalog 查找开销4、pg_has…...

redis实现缓存1-添加商户缓存

首先我们理解计算机硬件层面的缓存 (CPU Cache)。 计算机存储系统是一个金字塔结构,越靠近塔顶(CPU)的部件,速度越快、容量越小、成本越高;越靠近塔底,速度越慢、容量越大、成本越低。 缓存速度最快但容量最小,用于存储CPU立即需要的数据;内存作为中间层,存储正在运行…...

qemu的外部快照实现原理

一 基础概念 1 外部快照 当一个快照被创建时,创建时当前的状态保存在当前使用的磁盘文件中,即成为一个backing file。此时一个新的overlay被创建出来保存往后的数据。 2 backing file和overlay 对基础镜像做外部快照,生成的快照文件被称为overlay,基础镜像成为backing file…...

Springboot 集成 飞书群消息

Springboot 集成 飞书群消息前情概要 公司项目想要加入一个系统错误推送功能,方便线上项目运维,可选择的消息通知渠道很多,比如邮箱、短信、微信、飞书等等,但是邮箱每天有发送数量上限,而且还有其他必须要使用邮箱发送的功能,所以为了不影响必要功能的运行,邮箱不可取,…...

最新爆料:GitHub Copilot全面推出OpenAI GPT-5 和 GPT-5 mini!

最新爆料:GitHub Copilot全面推出OpenAI GPT-5 和 GPT-5 mini!OpenAI最新推出的GPT-5和GPT-5mini已全面接入GitHub Copilot,其中GPT-5mini面向所有用户开放,GPT-5仅限付费用户使用。用户可在主流开发环境和GitHub移动端通过模型选取器访问这些功能。企业版和商业版用户需管…...

netstat 命令查看端口状态详解

netstat 命令查看端口状态详解 转载请注明出处:netstat 可以查看服务器当前端口列表及指定端口的连接状态等;-t : 指明显示TCP端口,t是TCP的首字母。-u : 指明显示UDP端口,u是UDP的首字母-p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序,p是program的首字…...

智聘无界:AI 破解全球化招聘合规、成本与人才匹配难题的实践路径

引言:全球化浪潮下的招聘新挑战 在全球经济一体化进程加速的今天,企业边界日益模糊,跨国经营已成为常态。然而,伴随而来的全球化人才招聘难题也愈发凸显。传统招聘模式在面对日益复杂、多元的国际市场时,显得力不从心,主要表现为人才获取效率低下、运营成本高昂以及难以适…...

Nature | 本周最新文献速递

Molecular subtypes of human skeletal muscle in cancer cachexia 中文标题: 破解癌症恶病质肌肉谜团!整合RNA组学揭示两大分子亚型预示预后 关键词: 癌症恶病质、分子亚型、RNA组学、非负矩阵分解、肌肉萎缩 摘要总结: 这篇文章通过高通量测序分析结直肠癌和胰腺癌患者肌…...

Flink 与Flink可视化平台StreamPark教程(CDC功能)

本文分享自天翼云开发者社区《Flink 与Flink可视化平台StreamPark教程(CDC功能)》,作者:l****n 基本概念 flinkCDC功能是面向binlog进行同步、对数据的增删改进行同步的工具,能够实现对数据的动态监听。目前其实现原理主要为监听数据源的binlog对数据的变化有所感知。 在这…...

GAS_Aura-Setting Up Auto Running

1讲了使用Nav导航生成样条线驯寻路点进行移动...

Ubuntu 24.04 LTS 登录用户和密码忘记找回方法

1.重启服务器时按住Shift键位进入GNU GRUB界面,按向下方向键选择 *Advanced options for Ubuntu 回车2.拨动向下方向键,选择恢复模式 recovery mode 3.等待系统执行,拨动向下键进入root shell 4.在 root shell 提示符下,输入以下命令来列出系统中所有的用户:ls /home5.最后…...

错排问题

https://www.bilibili.com/video/BV1ZwmtYwEsK 第一个视频 https://www.bilibili.com/video/BV1Mw4m1y7xT...

源码调试-带你了解下车牌识别的深度学习模型-LPRNet

本期视频介绍了基于PyTorch的车牌识别模型LPRNet的调试运行过程。主要内容包括:1)项目结构分析和环境配置;2)单张图片识别代码实现,涵盖图像预处理、模型预测和结果可视化;3)注意事项说明。该模型支持蓝牌和新能源车牌识别,具有轻量级特性,适合实际应用开发。视频详细…...

仓储物流业务字段(一)

以下是整理的100个仓储物流数据库常用字段名,分类归纳如下: 基础信息类 仓库编码(warehouse_code) 仓库名称(warehouse_name) 仓库地址(warehouse_address) 仓库类型(warehouse_type) 负责人(manager) 容量(capacity) 仓库状态(status) 安全要求(safety_requi…...

ubuntu 24.04部署mysql8.0.41(glibc2.28)

环境Os:ubuntu 24.04 desktop桌面版mysql:8.0.41 glibc2.28查看操作系统信息root@db:/soft# uname -a Linux db 6.14.0-29-generic #29~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Aug 14 16:52:50 UTC 2 x86_64 x86_64 x86_64 GNU/Linuxroot@db:/soft# cat /etc/os-release PRET…...

cmakelist文件中常见语句的含义

最近在进行c++代码的编译,发现cmakelist文件中有很多语句。一开始小白并不理解什么含义,学习后特此记录,以方便以后自己查阅。 情况一:单个模块,无主模块包含多个子模块的情况 文件目录如下:MyProject/ ├── CMakeLists.txt ├── include/ │ └── my_library.h …...

charles破解-在线生成激活码

charles破解下载最新Charles,官网地址:Charles官网下载安装后,使用破解工具自动生成激活码Charles激活码自动生成工具具体用法如下:打开激活工具,输入RegisterName名称,名称可任意输入,点击生成即可自动生成激活码打开Charles,点击help,选择Register Charles,输入生成…...

微信个人号开发

微信个人号二次开发,是完整的第三方服务平台,并基于IPAD协议8.0.57开发出的最新个微API服务框架。 你可以 通过API 实现 个性化微信功能 (例云发单助手、社群小助手、客服系统、机器人等),用来自动管理微信消息。用户仅可一次对接,完善所有功能。可实现分布式部署,批量管…...

内部排序-直接插入排序冒泡排序快速排序对比

内部排序-直接插入排序冒泡排序快速排序对比内部排序-内部排序-直接插入排序冒泡排序快速排序对比 写在前面:参考《数据结构(C语言版)》严蔚敏 吴伟民 编著 清华大学出版社 2008年10月第27次印刷 📋 算法概述 直接插入排序(Straight Insertion Sort)是一种最简单的排…...

STM32读写EEPROM

代码如下#include "i2c.h" #include <string.h>/* M24C64设备地址(A0/A1/A2接地,7位地址为0x50,左移1位后为0xA0) */ #define EEPROM_ADDR (0x50 << 1) #define M24C64_PAGE_SIZE 32 // 页面大小:32字节 #define M24C64_WR…...

OpenStack Nova 创建虚拟机

创建虚拟机的过程是一个经典的分布式、异步、状态驱动的工作流。其核心设计哲学是:API 接收请求 -> 调度决策 -> 资源分配 -> 虚拟化层执行。整个过程涉及多个 Nova 服务以及外部组件(Glance, Neutron, Cinder, Keystone)。 1、基本流程 sequenceDiagramparticipan…...

AI革命2025:新一代人力资源管理系统十大标杆产品评测

导读:在数字化浪潮推动下,AI与移动技术正在重塑人力资源管理系统的行业格局。本文盘点了2025年中国市场十款主流智能人力资源管理系统,涵盖集团型、成长型及中小企业的核心需求。重点介绍红海eHR在AI智能体、移动端全流程和数据驱动决策上的创新优势,并通过多维度评分与场景…...

企业HR系统选型全指南:百人初创到万人集团的数字化方案与实施路径

导读:本篇文章围绕企业不同规模的人力资源管理需求,梳理了从百人初创到万人集团的HR系统选型逻辑。通过分层痛点分析、科学评估体系、信息密集对比表和真实案例,并系统推荐了包括i人事、北森、红海云在内的多款市场热门产品,助力企业高效推进HR数字化转型。本文属于深度内容…...

C++ auto关键字

C++ auto关键字的原理与使用auto关键字: 一、C++98标准auto关键字的作用和C语言的相同,表示自动变量,是关于变量存储位置的类型饰词,通常不写,因为局部变量的默认存储就是auto 1 void foo(void) 2 { 3 int a; //变量存储在栈区 4 auto int b; //…...

API 响应体加密场景下的调试实践:Postman 的局限与 Apipost 的优化

在日常开发和测试过程中,我们经常会遇到如下场景: 后端服务出于安全性或协议规范的考虑,对 API 的响应体进行了加密或编码处理,例如 Base64 编码、AES/RSA 加密等。这样做在生产环境中是合理且必要的,能够避免敏感数据被明文传输。但与此同时,也为开发和测试阶段的调试带…...

ARM主板:低功耗高性能的嵌入式计算核心

在当今数字化飞速发展的时代,计算机硬件领域不断创新变革,其中ARM主板凭借其独特的优势脱颖而出,成为众多应用场景的理想选择。无论是智能家居、工业自动化还是物联网设备等,都能看到它活跃的身影。下面将深入探讨ARM主板的相关特性、优势以及广泛的应用场景。 什么是ARM主…...

2025绩效管理必知

HR 往往是一个企业绩效管理的推动者,但是在推动的背后,实际有一个非常重要的目标,那就是提高个人和团队的绩效,从而提升企业整体的绩效。绩效管理就是要找到 “应该实现什么 “和 “如何实现 “这些问题的答案。它是关于寻找更有效的方法来提高业务绩效。 绩效管理关注什么…...

【刷题笔记】cf808f

CF803F 场上死磕无法战胜,原来是个绿题吗哈哈。 考虑到跟序列的顺序无关,直接在值域上做。我们设 \(f_i\) 表示 \(\gcd = i\) 的方案数。那么有 \[f_i = 2^{g_i} - 1 - \sum_{i | d \land i \ne d} f_d \]\(g_i\) 是原序列中是 \(i\) 倍数的个数。那么调和级数 \(O(V\log V)\…...

Laravel APP_DEBUG=true:存在账户信息泄露风险

Laravel APP_DEBUG=true:存在账户信息泄露风险 在 Laravel 开发过程中,APP_DEBUG=true 是一个高频使用的配置 —— 它能在代码报错时显示详细的堆栈跟踪、变量值和配置信息,极大提升调试效率。但鲜少有人意识到,若将开启调试模式的项目部署到生产环境,会直接沦为账户信息泄…...

将当前目录下的所有文件 / 目录完整复制到/tmp目录,且会保留文件的权限、所有者、时间戳等属性

tar cvf - * | (cd /tmp && tar xvfp -)...

C# 操作 DXF 文件指南

C# 操作 DXF 文件主要借助一些专业的库来解析其结构并处理其中的图形数据。 C# 操作 DXF 文件指南 摘要 通过 C# 操作 AutoCAD 导出的 DXF 文件,你可以实现图纸的读取、编辑、创建和转换。本指南将介绍两个主流的开源库 netDxf 和 DXF.NET (IxMilia.Dxf),并提供核心代码示例、…...

在Proxmox中部署Security Onion的安全配置实战

本文详细记录了在Proxmox虚拟化环境中部署Security Onion网络监控系统的完整过程,重点解决了官方文档未涉及的网桥配置问题,包括创建无IP嗅探接口、Linux网桥设置及虚拟机网络设备配置等关键技术环节。在Proxmox中部署Security Onion的安全配置实战 文档说明 Security Onion项…...

报表到 BI:企业数据从展示到决策的进阶之路

报表与BI分析:从数据展示到决策洞察的进化之路 企业数字化转型的浪潮里,“数据驱动决策” 早成共识,可不少企业仍在 “报表” 与 “BI 分析” 的迷雾里打转:是替代,还是互补?为何满墙报表难寻洞察?为何 BI 工具常被业务部门当作 “数据探索的钥匙”?本文从本质差异、能…...

抢先体验智能测试时代,QA必备AI测试工具

敏捷开发模式下的测试挑战 敏捷开发模式下,业务快速迭代,给测试团队带来了前所未有的压力。每一次功能升级或系统迁移,都意味着从功能测试、兼容性测试、性能测试到安全性的大规模回归验证。测试规模成倍增长,而团队人力却往往难以及时扩充。 再加上多设备、多系统环境下频…...

Flink 与Flink可视化平台StreamPark教程(DataStreamApi基本使用)

本文分享自天翼云开发者社区《Flink 与Flink可视化平台StreamPark教程(DataStreamApi基本使用)》,作者:l****n DataStreamApidataStreamApi是一切的基础,处于调度flink程序处理任务的起点。Flink 有非常灵活的分层 API 设计,其中的核心层就是 DataStream/DataSet API。由…...

内部排序-直接插入排序

内部排序-直接插入排序内部排序-直接插入排序 写在前面:参考《数据结构(C语言版)》严蔚敏 吴伟民 编著 清华大学出版社 2008年10月第27次印刷 📋 算法概述 直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排号序的…...

玩转n8n测试自动化:核心节点详解与测试实战指南

掌握节点,掌握自动化测试的核心 在n8n中,节点(Node)是构建自动化工作流的基础单元。每一个节点都代表一个特定的操作或功能,通过将不同的节点连接起来,我们就能创造出强大的测试自动化流程。本章将深入讲解测试工程师必须掌握的几类核心节点,并通过实际测试场景展示如何…...

Linux:龙晰系统(Anolis)更新yum(dnf)仓库源

一、备份现有仓库源 1. 查看当前系统版本 cat /etc/os-release2. 备份现有仓库源 # 一共两个文件,都需要备份下:AnolisOS-BaseOS.repo AnolisOS-AppStream.repo cp /etc/yum.repos.d/AnolisOS-BaseOS.repo /etc/yum.repos.d/AnolisOS-BaseOS.repo.bak cp /etc/yum.repos.d/…...

(笔记)多项式基础 FFT

多项式 \[F(x)=\sum_{i=0}^{i-1}a_ix^i \]对多项式进行乘法,就是对两个多项式进行加法卷积。其中卷积结果 \(C(k)=\sum_{i=0}^kA(i)B(k-i)\)。 分治乘法 将 \(A(x)\) 左右拆半,不足则末尾(最高位)补上 \(0\),令 \(n=2^k\)。则 \[A(x)=A_0(x)+x^{n/2}A_1(x) \]\[A_0(x)=\su…...

MAC tomcat启动报错

MAC tomcat启动报错 org/apache/catalina/startup/Bootstrap has been compiled by a more recent前言 配置好tomcat启动报错 已连接到地址为 127.0.0.1:50303,传输: 套接字 的目标虚拟机 已与地址为 127.0.0.1:50303,传输: 套接字 的目标虚拟机断开连接 Exception in thread…...

研究生-必看-倒计时3天/武汉科技大学主办/稳定EI会议/高层次教授出席报告

武汉科技大学主办/EI稳定检索/大数据与智慧医学📢大数据与智慧医学国际学术会议(BDIMed 2025) 🔍武汉科技大学主办|高层次嘉宾出席报告| IEEE出版EI/Scopus/IEEE Xplore检索|高录用、快见刊 🔍征稿范围广:数字健康技术|智能医疗与可穿戴智能|物联网与智慧健康|医学成像…...

LGP7113 [NOIP 2020] 排水系统 学习笔记

LGP7113 [NOIP 2020] 排水系统 学习笔记 Luogu Link 题意简述 给定一个 \(n\) 个点的 \(\texttt{DAG}\)。我们认为它是一个排水系统。 节点 \(u\) 有 \(d_u\) 条输出管道,污水会被平分成 \(d_u\) 份流向下家节点。特别的,\(d_u=0\) 时认为这个节点直通污水厂,是一个最终排水…...

MySqlException: Incorrect string value: \xE6\x99\xBA\xE8\x83\xBD... for column FieldName at row 1

问题:MySqlException: Incorrect string value: \xE6\x99\xBA\xE8\x83\xBD... for column FieldName at row 1 原因:在 MySQL 中遇到错误 MySqlException: Incorrect string value: \xE6\x99\xBA\xE8\x83\xBD... 通常是由于尝试将一个不兼容的字符编码插入到数据库中导致的。…...