python threading异步并发调用示例

在开发python服务中,经常会遇到不再等待实际任务运行,需要提前返回。

比如,图像生成、LLM调用,这类任务运行时间较长。

一般主程序在异步启动实际任务后,会提前退出,然后隔一段时间轮询一次,检查任务是否完成。

python有多种方式实现异步执行,这里通过threading方式实现异步执行。

首先示例正常运行程序,然后尝试改为threading异步版本。

所用示例代码参考和修改自网络资料。

1 同步调用

1.1 同步运行分析

这是一个正常运行的程序,在main中以顺序执行的方式,分别运行阻塞程序1、阻塞程序2。

由于不涉及异步执行,所以没有实际用到threading包。

同步运行控制简单,存在的问题是一个时间段只能运行一个程序,效率较低。

1.2 同步运行示例

这是同步运行程序的示例代码

复制代码
import  threading,time

def thead(num):
    time.sleep(1)
    print("阻塞程序%s开始执行"%num)
    time.sleep(3)
    print("阻塞程序%s执行完毕"%num)

def main():
    print("主方法开始执行")

    for i in range(1, 3):
        thead(i)

    print("主方法执行完毕")
    return

if __name__ == '__main__':
    print(time.ctime())
    num = main()
    print("返回结果为%s"%num)
    print(time.ctime())

如下所示,首先程序1运行开始,程序1结束,然后程序2开始,程序2结束,整个过程顺序进行。

Thu Dec 4 09:50:42 2025

主方法开始执行

阻塞程序1开始执行

阻塞程序1执行完毕

阻塞程序2开始执行

阻塞程序2执行完毕

主方法执行完毕

返回结果为None

Thu Dec 4 09:50:50 2025

2 异步调用

2.1 异步运行分析

由于一些实际需求,主方法main可能需要在启动程序1和程序2后提前退出。

这个时候就会用到python threading的异步执行功能。

主方法main通过threading分别为程序1和程序2创建线程1和线程2,示例代码如下。

poll = \[\]#线程池

for i in range(1,3):

thead_one = threading.Thread(target=thead, args=(i,))

poll.append(thead_one) #线程池添加线程

然后,主方法main在分别异步启动线程1和线程2,示例代码如下。

for n in poll:

n.start() #准备就绪,等待cpu执行

启动完成后,主方法main就可以提前退出了。

print("主方法执行完毕")

return

主方法main退出后,线程1和线程2可能还在异步运行。

异步运行控制复杂,然而可减少主程序等待,在同一时间段并发运行多个程序,效率高。

2.2 异步运行示例

这是异步运行程序的示例代码。

复制代码
import  threading,time

def thead(num):
    # time.sleep(1)
    print("线程%s开始执行"%num)
    time.sleep(3)
    print("线程%s执行完毕"%num)

def main():
    print("主方法开始执行")

    #创建2个线程
    poll = []#线程池
    for i in range(1,3):
        thead_one = threading.Thread(target=thead, args=(i,))
        poll.append(thead_one) #线程池添加线程
    for n in poll:
        n.start()   #准备就绪,等待cpu执行
        
    print("主方法执行完毕")
    return

if __name__ == '__main__':
    print(time.ctime())
    num = main()
    print("返回结果为%s"%num)
    print(time.ctime())

输出如下所示,

主方法在启动线程1、线程2后就退出

线程1、线程2转为后台并发运行,其退出时间可以晚于主方法的退出时间。

然而,线程1、线程2同时并行运行,能减少等待时间,提高运行效率。

Thu Dec 4 10:02:29 2025

主方法开始执行

线程1开始执行

线程2开始执行

主方法执行完毕

返回结果为None

Thu Dec 4 10:02:29 2025

线程1执行完毕

线程2执行完毕

reference


python线程实现异步任务

https://www.cnblogs.com/lyxdw/p/9993293.html

python使用async和await并发编程示例

https://blog.csdn.net/liliang199/article/details/151117291

相关推荐
2601_966949651 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行5 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885725 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI6 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫7 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots8 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq8 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司8 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
“AI国潮设计-小江”9 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc