You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断函数是同步(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:25:52