多线程、多进程、协程:
是什么? 能干什么?
单线程情况下,执行效率低。系统的资源没有得到充分利用。
计算密集型(运算量比较大)、IO密集型(CPU空闲,输入输出较多)
怎么干?
爬虫:(IO密集型)
多线程:
横向:所有的程序的执行都在一个线程中,程序启动时,启动多线程,每个线程跑同样的代码。
纵向:将程序进行拆分,每个线程跑特定的程序,实现一部分功能。
怎么编写多线程:
创建子线程: t = threading.Tread(target=函数名)
设置守护线程: t.setDaemon(True) # 次要的线程,从属于主线程的线程,主线程结束,守护线程跟着结束
启动线程: t.start()
队列:
Queue:先进先出。
put(): 放一个任务进入队列,任务队列的计数器会加1
get(): 从队列中获取一个任务
task_done(): 标记这个任务已经完成,任务队列的计数器会减1
join(): 阻塞进程,程序等待队列的任务计数器为0.
线程池:
为啥要引入线程池?
创建线程和回收线程的资源需要花费时间,如果碰到频繁的创建和销毁线程,可以考虑使用线程池。
是什么?一个存储了已经创建好线程的池子,使用线程执行程序不需要再重新创建线程、销毁线程,而是直接从池中取出线程对象进行使用,用完再还回去的一种解决方案。
怎么用?
创建线程池:
from multiprocessing.dummy.pool import Pool
p = Pool(5)
添加任务:
p.apply_async(函数名1, callback=函数名2)