多线程的使用场景比如:频繁数据库连接,频繁的资源读取(如频繁读文件、玩命读kafka什么的)
- 多线程:适合IO密集型
- 多进程:适合计算密集型
使用线程池的好处是自动管理线程,不会导致线程资源浪费和代码冗余,但是线程之间交换资源会导致额外的同步开销,下面是使用的示例:
示例代码
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime
def my_func(param1, param2): # 多线程执行的函数
print("开始:", param1, param2, "时间:", datetime.now())
time.sleep(3)
return param1, param2
thread_pool = ThreadPoolExecutor(max_workers=4) # 初始化线程池,指定4线程
thread_mission_list = [] # 用来记录线程的任务对象
for _index in range(30):
run_thread = thread_pool.submit(my_func, _index, _index) # 多个参数像这样直接传递即可
thread_mission_list.append(run_thread)
for mission in as_completed(thread_mission_list): # 这里会等待线程执行完毕,先完成的会先显示出来
# 这里会自动等待执行完毕
print("结束:", mission.result(), "时间:", datetime.now())
结果:
开始: 0 0 时间: 2022-03-04 14:13:56.576031
开始: 1 1 时间: 2022-03-04 14:13:56.576292
开始: 2 2 时间: 2022-03-04 14:13:56.576427
开始: 3 3 时间: 2022-03-04 14:13:56.576566
开始: 4 4 时间: 2022-03-04 14:13:59.578705
开始: 5 5 时间: 2022-03-04 14:13:59.578762
开始: 6 6 时间: 2022-03-04 14:13:59.578812
开始: 7 7 时间: 2022-03-04 14:13:59.578859
结束: (1, 1) 时间: 2022-03-04 14:13:59.578925
其他参考
线程数量的设置可以参考:面试问我,创建多少个线程合适?我该怎么说