1. 如何优雅的计算接口耗时

日常工作中可能需要记录一次调用的耗时,如下

func handler(a, b int) string {
	t0 := time.Now()
	if a > b {
		time.Sleep(100 * time.Millisecond)
		fmt.Printf("1. use time %d ms\n",time.Since(t0).Milliseconds())
		return "ok"
	} else {
		time.Sleep(200 * time.Millisecond)
		fmt.Printf("2. use time %d ms\n",time.Since(t0).Milliseconds())
		return "ok"
	}
}

func main(){
	handler(3,4)
}

运行结果
2. use time 203 ms

诚然,上面的代码能实现需求,但是实现方式很不优雅,计算耗时的代码散落各处,那么有没有更好的方式呢?当然有,用golangdefer即可,如下代码

func handler1(a, b int) string {
	t0 := time.Now()
	defer fmt.Printf("1. use time %d ms\n",time.Since(t0).Milliseconds())
	if a > b {
		time.Sleep(100 * time.Millisecond)
		return "ok"
	} else {
		time.Sleep(200 * time.Millisecond)
		return "ok"
	}
}

func main(){
	handler(3,4)
}

运行结果
 use time 0 ms

为什么会是0毫秒呢?原因是defer在注册的时候就把使用到的相关计算表达式计算好了,在最后不过是打印输出而已。

那么应该如何做呢?使用闭包即可,即使用匿名函数的方式,defer后面如果跟的是匿名函数,则是会在defer实际运行的时候,才会去计算匿名函数中的相关表达式,如下

func handler2(a, b int) string {
	t0 := time.Now()
	defer func() {
		fmt.Printf("use time %d ms\n",time.Since(t0).Milliseconds())
	}()
	if a > b {
		time.Sleep(100 * time.Millisecond)
		return "ok"
	} else {
		time.Sleep(200 * time.Millisecond)
		return "ok"
	}
}

func main(){
	handler2(3,4)
}

运行结果
use time 203 ms
FastAPI 是一个由星标(Starred)的 Python Web 框架,它专注于速度和现代开发。当涉及到执行长流程(例如耗时的操作、外部 API 调用或数据库查询)时,FastAPI 提供了一些策略来优化接口设计,确保高可用性和用户体验: 1. **异步处理**:FastAPI 内置了对异步编程的支持,如使用 `asyncio` 和 `aiohttp`。对于长时间运行的任务,你可以编写异步函数,这样不会阻塞主线程,从而提高响应速度。 2. **异步路由**:使用 `FastAPI.background_tasks()` 或 `FastAPI.middleware.background()` 来处理那些不需要立即响应的长任务,它们会在单独的工作线程或进程池中执行。 3. **分片处理**:如果某个操作非常大,可以考虑将其分解为多个小步骤,每个步骤返回给客户端一部分结果。这可以通过提供分页功能来实现,让客户端能够逐步获取完整的数据。 4. **信号管理**:使用信号或回调机制,例如 FastAPI 的 `Depends` 注解,可以将长流程的结果通知给调用方,而不是直接返回整个结果。 5. **Caching**:对于重复执行的长流程,可以考虑缓存结果,避免不必要的重复计算。FastAPI 可以配合第三方库如 `uvicorn-cache` 或 `FastAPI-Cache` 进行缓存。 6. **错误处理**:确保长流程接口能够优雅地处理错误,并提供合适的错误信息给客户端,以免客户端因为长时间等待而变得不稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值