线程
- 线程是cpu执行的基本单元
- 线程之间的执行是无序的
- 统一进程下的现成的资源是共享的 (线程锁,互斥锁)
- 线程可以实现多任务,多用来处理I/O密集型任务
- GIL:由于python的CPython解释器的原因,存在一个GIL全局解释器锁
- 用来保证同一时刻只有一个线程在执行,类似于单核处理,所有说多线程并不能。
- 充分的利用cpu资源
线程池
- 在涉及到多任务的情况下,往往需要大量的线程去执行任务
- 这时如果手动创建线程不太方便,高效,我们可以使用线程池创建线程,执行任务.
- 线程池中的县城任务跳读不需要任何干预.
线程 | |
---|---|
使用模块import threading | |
threading.Thread() | target:县城要执行的目标函数 name:线程名称 args:传参数(元组) kwargs:传参数 (字典) |
start()方法 | 开启线程 |
join()方法 | 线程堵塞 |
daemon = False | (后台线程,主线程约束子线程谁知结束) |
线程执行是无顺序的 | |
线程支援是共享的 |
多线程爬虫(生产者,消费者模式) |
---|
任务队列 |
爬取线程 |
数据队列 |
解析线程 |
线程池 |
---|
concurrent.futures import ThreadPoolExecutor |
创建一个线程池 |
pool = ThreadPoolExecutor(max_workers=8) |
往线程池中提交任务fn(要执行的任务),*args(要传递的参数),**kwargs (要传递的参数)result = pool.submit(crawlPageData,url,name=‘1808’) |
给线程添加后调方法(add_done_callback添加的是方法名)result.add_done_callback(done) |
pyqyery解析库 介绍
pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析HTML文档,易用性和解析数度都很好
Pyqyery解析库的使用 |
---|
初始化pq_html = pq("") pq_html = pq(filename=path_to_html_file) |
.find():查找嵌套元素 |
.filter(selector): 根据 class, id 筛选指定元素 |
.eq(index): 根据索引号获取指定元素 (index从0开始) |
pq_html(selector): 通过css选择器来获取目标内容 |
.text()获取标签的文本 |
.attr(‘属性值’):获取标签属性 |
线程锁
创建线程
target:执行的函数
name:设置线程的名称
args:给执行的函数传递参数(tuple)
kwargs:给执行的函数传递参数(dict)
daemon:默认为Flase,主线程结束,不影响子线程执行
daemon:为True,主线程结束,子线程结束