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

browser-use 库中异步函数执行时间装饰器

目录

    • 代码
    • 代码解释
    • 示例

代码

import asyncio
import logging
import time
from functools import wraps
from typing import Any, Callable, Coroutine, ParamSpec, TypeVar

# 设置日志
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

# 定义类型变量
R = TypeVar('R')
P = ParamSpec('P')


def time_execution_async(
	additional_text: str = '',
) -> Callable[[Callable[P, Coroutine[Any, Any, R]]], Callable[P, Coroutine[Any, Any, R]]]:
	def decorator(func: Callable[P, Coroutine[Any, Any, R]]) -> Callable[P, Coroutine[Any, Any, R]]:
		@wraps(func)
		async def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
			start_time = time.time()
			result = await func(*args, **kwargs)
			execution_time = time.time() - start_time
			logger.debug(f'{additional_text} Execution time: {execution_time:.2f} seconds')
			return result

		return wrapper

	return decorator



代码解释

这段代码实现了一个用于测量异步函数执行时间的装饰器。

  1. 导入和配置:
import asyncio, logging, time
from functools import wraps
from typing import Any, Callable, Coroutine, ParamSpec, TypeVar

# 配置日志级别为DEBUG以显示执行时间
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
  1. 类型变量定义:
R = TypeVar('R')  # 用于表示函数返回值类型
P = ParamSpec('P')  # 用于表示函数参数类型
  1. 装饰器实现:
def time_execution_async(additional_text: str = ''):
  • 外层函数:接收装饰器参数
  • 参数 additional_text:用于在日志中标识不同的执行时间记录
  1. 装饰器核心结构:
def decorator(func):      # 接收被装饰的函数
    @wraps(func)         # 保持原函数的元数据
    async def wrapper(*args, **kwargs):  # 包装函数
        start_time = time.time()         # 记录开始时间
        result = await func(*args, **kwargs)  # 执行原函数
        execution_time = time.time() - start_time  # 计算执行时间
        logger.debug(f'{additional_text} Execution time: {execution_time:.2f} seconds')
        return result
    return wrapper
return decorator

主要功能:

  1. 测量异步函数执行时间
  2. 保持原函数的类型信息和签名
  3. 通过日志输出执行时间
  4. 支持自定义日志标识文本

使用场景:

  • 性能分析
  • 执行时间监控
  • 异步操作调试
  • 性能瓶颈定位

示例

# 示例1:基本使用
@time_execution_async('--fetch-data')
async def fetch_data():
    await asyncio.sleep(1)  # 模拟网络请求
    return {'data': 'example'}

# 示例2:带参数的函数
@time_execution_async('--process-user')
async def process_user(user_id: int, update: bool = False):
    await asyncio.sleep(0.5)  # 模拟处理时间
    return f"User {user_id} processed"

# 使用示例
async def main():
    # 调用装饰后的函数
    data = await fetch_data()
    result = await process_user(123, update=True)
    
    print(data)  # {'data': 'example'}
    print(result)  # User 123 processed

asyncio.run(main())

python test_record.py
DEBUG:asyncio:Using proactor: IocpProactor
DEBUG:__main__:--fetch-data Execution time: 1.00 seconds
DEBUG:__main__:--process-user Execution time: 0.50 seconds
{'data': 'example'}
User 123 processed

相关文章:

  • 搭建私人对外git空间
  • 内网渗透-DLL和C语言加载木马
  • OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher
  • C++面试题库
  • 【已解决】Git:为什么 .gitignore 不生效?如何停止跟踪已提交文件并阻止推送?
  • 算法 | 2024最新算法:鳑鲏鱼优化算法原理,公式,应用,算法改进研究综述,matlab代码
  • 科软25机试
  • 【服务端】使用conda虚拟环境部署Django项目
  • ESP32-CAM在PlatformIO IDE里实现OTA的几个小TIPS
  • java程序员实用英语学习总结
  • JBDev - Theos下一代越狱开发工具
  • OpenBMC:BmcWeb 生效路由2 Trie字典树添加节点
  • CentOS 7 磁盘及分区管理笔记
  • Redis 性能数据解读与问题排查优化版
  • Oracle 10G DG 修复从库-磁盘空间爆满导致从库无法工作
  • SvelteKit 最新中文文档教程(12)—— 高级路由
  • LeetCode 解题思路 26(Hot 100)
  • 计算机网络基础:量子通信技术在网络中的应用前景
  • js文字两端对齐
  • 蓝桥杯第10届 后缀表达式
  • 怎么把做的网站发到网上去/软文代写网
  • 深圳宝安外贸网站建设公司/设计网站
  • 网站建设中怎样设置背景/百度推广代运营公司
  • 织梦商城网站模板/独立站怎么建站
  • 深圳网站建设的基/搜索引擎是网站吗
  • 做动态网站 和数据库交互/软文发稿网站