FastAPI 的接口中使用 asyncio.Lock 效率怎么这么低?获取和释放都要几秒

2020-11-29 16:18:47 +08:00
 chaogg
app = FastAPI()
lock: Optional[asyncio.Lock] = None
spider = Spider()


@app.get('/xxx')
async def xxx(s: str):
    t1 = time()
    await lock.acquire()
    t2 = time()
    r = await spider.check(s)
    t3 = time()
    lock.release()
    t4 = time()
    logging.info(f"等待耗时{t2-t1}s,check 耗时{t3-t2}s,归还耗时{t4-t3}s")
    return r


async def main():
    log_config = generate_logging_dict()
    
    loop = asyncio.get_event_loop()
    global lock
    lock = asyncio.Lock()
    
    config = Config(app=app, loop=loop, log_config=log_config, workers=1,
                    host="0.0.0.0", port=8000)
    server = Server(config)
    
    tasks = [server.serve()]
    await asyncio.gather(*tasks)
    
    await spider.close()


if __name__ == '__main__':
    config_root_logger()
    asyncio.run(main())

获取 lock 和归还 lock 的耗时居然在 5~8s 吗?这也太奇葩了吧。 选取几次代表性的日志如下:

等待耗时 5.4836273193359375e-06s,check 耗时 1.3153741359710693s,归还耗时 8.58306884765625e-06s

等待耗时 5.9604644775390625e-06s,check 耗时 0.6164107322692871s,归还耗时 1.1205673217773438e-05s

等待耗时 6.67572021484375e-06s,check 耗时 0.5971970558166504s,归还耗时 8.344650268554688e-06s

2662 次点击
所在节点    Python
7 条回复
mckelvin
2020-11-29 16:55:22 +08:00
单位你没仔细看哦。1e-06 s = 0.000001 s
chaogg
2020-11-29 17:07:36 +08:00
@mckelvin 大意了
laike9m
2020-11-29 17:13:30 +08:00
🤣
xiaolinjia
2020-11-29 17:36:25 +08:00
你把大伙都整笑了。
chaogg
2020-11-29 17:53:41 +08:00
@xiaolinjia 我自己也笑了
CallMeReznov
2020-11-29 19:40:31 +08:00
abersheeran
2020-11-30 09:10:17 +08:00
噗,你要是用了 time_ns(),应该就能感觉出来不太对了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/730328

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX