定时器 线程池\进程池

定时器

  • 可以指定线程多久后启动,(并且他是一个异步的线程,也就是并发)
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)

posted @ 2019-09-19 20:22  cheerxiong  阅读(592)  评论(0编辑  收藏  举报