线程池的使用
前言:
在python中经常会用到异步,线程池,进程池,解决IO的操作,在爬虫中不建议使用进程池(消耗太大)
目标:
学会使用线程池
在使用多线程之前,先看下单线程
示例:
import time def f1(): for i in range(3): print(f"我饿了{i}") time.sleep(1) def f2(): for i in range(3): print(f"开饭了{i}") time.sleep(1) if __name__ == "__main__": start=time.time() f1() f2() end=time.time() print("消耗时间为:",end-start)
输出结果如下:
我饿了0 我饿了1 我饿了2 开饭了0 开饭了1 开饭了2 消耗时间为: 6.048200368881226
可以看出,程序是按顺序执行的,f1完全执行完毕才会执行f2,这个时候就是单任务
接下来演示多线程
基础用法
# 导入threading模块 import threading from threading import Thread # 使用threading模块中的Thread创建一个对象 t1=threading.Thread(target=xx) # xx为函数的名字 # 调用这个实例对象的start方法让这个线程开始运行 t1.start()
# 带参数的函数
def my_func(a,b):
print(a,b)
t=threading.Thread(target=my_func,args=(100,200))
t.start() # 启动线程
t.join() # 等待结束
多线程示例:
import time import threading def f1(): for i in range(3): print(f"我饿了{i}") time.sleep(1) def f2(): for i in range(3): print(f"开饭了{i}") time.sleep(1) if __name__ == "__main__": t1=threading.Thread(target=f1) t2=threading.Thread(target=f2) t1.start() t2.start() print("--------")
输出结果
我饿了0 开饭了0 -------- 开饭了1 我饿了1 开饭了2 我饿了2
不知道为什么print没有在最后输出。
线程池
from concurrent.futures import ThreadPoolExecutor import time def func(name): print(name) time.sleep(3) start=time.time() with ThreadPoolExecutor(20) as t: for i in range(20): t.submit(func,"张三:%s"%i) # pool=ThreadPoolExecutor(10) # for i in range(20): # pool.submit(func,"%s:张三"%i) # pool.shutdown() 和with效果一样 end=time.time() spend=end-start print(f"耗时间为:{spend}")