Python从其他函数启动线程运行后台任务时主线程阻塞问题求助
问题排查与解决方案
主线程阻塞的常见原因
你当前的线程创建逻辑本身没有语法错误,出现主线程等待zapisNoveho执行完成的情况,通常是以下几种问题导致:
- 你在
th.start()之后的代码中调用了th.join()方法,该方法会强制主线程等待目标子线程执行完毕再继续运行,如果你不需要获取zapisNoveho的返回结果,直接删除join调用即可。 zapis或者dbChanger.zapisDb方法内部使用了全局互斥锁,且主线程后续逻辑也需要抢占同一把锁,看起来像是主线程在等sleep执行,实际是在等待子线程释放锁资源。- 你使用的运行环境对多线程支持存在限制,比如部分嵌入式Python runtime、受GIL影响的CPU密集型任务场景,但该情况出现概率极低。
Asyncio适用性说明
该场景是否适合用Asyncio取决于你现有项目的架构:
- 若你的项目整体是IO密集型(大量数据库操作、网络请求、定时等待逻辑),已经基于Asyncio构建事件循环,那么用Asyncio更合适:将
zapisNoveho改写为async函数,把time.sleep(10)替换为asyncio.sleep(10),调用时用asyncio.create_task(zapisNoveho(obj, obj_stav_novy))即可,资源开销比多线程更低。 - 若你的项目已经是成熟的多线程/多进程架构,没有用Asyncio的基础,完全不需要为了这个场景重构,修复现有线程逻辑的问题即可。
快速排查步骤
- 先注释掉
zapisNoveho内部的zapis、dbChanger.zapisDb调用,只保留sleep(10),观察主线程是否还会阻塞,如果不再阻塞,即可定位是两个业务方法的锁竞争问题。 - 检索项目中
th.join()的调用,确认是否多余调用了该方法。
内容的提问来源于stack exchange,提问作者Dan Rykala
相关产品推荐
相关产品推荐

