如何判断函数是同步(sync)还是异步(async)?——基于计时装饰器需求
完善支持同步/异步函数的计时装饰器
要判断传入的函数是同步还是异步,你可以用Python标准库的inspect模块,通过inspect.iscoroutinefunction()方法获取布尔值func_is_async,这个方法能直接识别函数是否为异步协程函数。
以下是完善后的完整装饰器代码:
import time import asyncio import inspect import logging from functools import wraps # 配置基础日志,避免未初始化报错 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def timeit(func): @wraps(func) def timeit_wrapper(*args, **kwargs): # 核心判断:函数是否为异步协程函数 func_is_async = inspect.iscoroutinefunction(func) start_time = time.perf_counter() if func_is_async: result = asyncio.run(func(*args, **kwargs)) else: result = func(*args, **kwargs) end_time = time.perf_counter() total_time = end_time - start_time logger.info( f"Function {func.__name__}: with {args=} {kwargs=} Took {total_time:.4f} seconds" ) return result return timeit_wrapper
关键细节说明:
inspect.iscoroutinefunction(func):专门检测函数是否由async def定义,返回布尔值,是判断同步/异步的核心逻辑。- 补充了原代码缺失的模块导入,确保代码可直接运行。
- 添加基础日志配置,解决原代码中
logger未初始化的潜在问题。
测试示例:
# 测试同步函数 @timeit def sync_add(a, b): time.sleep(0.3) return a + b # 测试异步函数 @timeit async def async_multiply(x, y): await asyncio.sleep(0.3) return x * y sync_add(10, 20) asyncio.run(async_multiply(10, 20))
内容的提问来源于stack exchange,提问作者MKMS
相关产品推荐
相关产品推荐

