定时器
- 可以指定线程多久后启动,(并且他是一个异步的线程,也就是并发)
from threading import Timer
"""
这个相当于开启了一个可以定义时间的线程,不需要导入Thread模块了,Timer模块可以直接创建一个线程
"""
def foo(name):
print(f"{name}定的时间到了,开启啦")
t = Timer(3,foo,('xc',))
t.start()
线程池\进程池
- 线程池\进程池就是控制线程\进程的数据量,并且不会回收,会放在池里面重复使用这几个线程\进程.
- 线程池\进程池不同于信号量,这是两个东西,池是控制线程的总数量,以自己控制的数量去操作很多条任务,信号量是控制线程的并发的运行的数量,不会控制线程的总数量
什么时候使用池
使用池的好处
- 不用重复的去创建回收线程\进程,减少了系统资源的开销以及时间上的开销
- 如果不使用线程池,就会因为制造了大量线程消耗内存,和线程太多,造成cpu过渡切换
- 总的来说就是节约系统资源,以及重复造线程\进程的开销,信号量是没有这个好处的,他只是让同一段代码,多少个进程可以去操作他.
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
# 导入一个线程池模块和一个进程池模块,这两个模块的使用方法是一样的
import time
result_lis = []
def foo(user,pwd):
time.sleep(0.3)
print(f"你的账号为{user},你的密码为{pwd}")
return pwd * 10
def back_main(x):
result_lis.append(x.result())
tpool = ThreadPoolExecutor(4)
for i in range(12):
res = tpool.submit(foo,'xc',i).add_done_callback(back_main) # 传值不是以元组的形式传值
# print(res.result())
tpool.shutdown()
print("结束")
print(result_lis)