二、多线程
线程:比如qq。比如暴风影音,比如word
可以同时语音、同时视频、同时聊天,多线程
暴风影音,视频播放、音频播放,多线程
word,打字,拼写检查,等,多线程
多任务的实现:多进程、多线程
主进程-子进程1-子进程2 特点:进程之间没有关系,如果一个进程挂了,不影响其它子进程
进程-主线程-子线程1-子线程2
特点:线程之间有关系,如果一个线程挂了,整个进程就挂了
实现方式:(thread)
面向过程
t = Thread(target=xxx, name=xxx, args=(xxx,))
target: 线程启动之后要执行的函数
name: 线程的名字
args: 给线程传递的参数
t.start(): 启动线程
t.join(): 让主线程等待子线程结束
threading.current_thread().name : 获取线程名字
面向对象
见代码
全局变量
共享全局变量
局部变量
不共享局部变量
线程安全问题
线程之间可以共享全局变量
加锁
3、队列
队列:买火车票,电动三轮,特点:先进先出
用在哪?线程之间使用队列进行交互,让线程解耦合,生产者-消费者模型
线程1-生产数据
交互渠道:队列
线程2-消费数据
while 1:
生产数据
消费数据
队列使用:
from queue import Queue
q = Queue(5)
q.put() 添加元素
q.put(False) 如果队列已满,添加元素立即抛出异常
q.put(True, 5) 如果队列已满,添加元素5s之后抛出异常
q.get() 获取元素
q.get(False) 如果队列为空,获取元素立即抛出异常
q.get(True, 5) 如果队列为空,获取元素5s之后抛出异常
q.empty() 队列是否为空
q.full() 队列是否已满
q.qsize() 队列长度
4、多线程爬虫
分析:爬虫里面如何分多线程,
循环:
拼接url,发送请求,获取响应
解析响应,保存到文件
涉及到:
采集线程,3个线程同时采集
解析线程,3个线程同时解析
页码队列:里面是要爬取的页码数据
数据队列:采集线程向队列中添加数据
解析线程从队列中获取数据
保存到同一个文件中,锁机制
网友评论