我爱编程

python 爬虫之--多线程

2018-07-26  本文已影响0人  佐卡ww

二、多线程

线程:比如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个线程同时解析

页码队列:里面是要爬取的页码数据

数据队列:采集线程向队列中添加数据

解析线程从队列中获取数据

保存到同一个文件中,锁机制

上一篇下一篇

猜你喜欢

热点阅读