多线程

1.一个cpu一次只能执行一个任务,多个cpu同时可以执行多个任务

2.一个cpu一次只能执行一个进程,其它进程处于非运行状态

3.进程里包含的执行单元叫线程,一个进程可以包含多个线程

4.一个进程的内存空间是共享的,每个进程里的线程都可以使用这个共享空间

5.一个线程在使用这个共享空间的时候,其它的线程必须等待(阻塞状态)

6.互斥锁作用就是防止多个线程同时使用这块内存空间,先使用的线程会将空间上锁,其它的线程处于等待状态。等锁开了才能进

7.进程:表示程序的一次执行

8.线程:CPU运算的基本调度单位

9.GIL(全局锁):python里的执行通行证,而且只有一个。拿到通行证的线程就可以进入CPU执行任务。没有GIL的线程就不能执行任务

10.python的多线程适用于大量密集的I/O处理

11.python的多进程适用于大量的密集并行计算

python的GIL(全局解释锁,解释器Cpython加入的一种机制),因为这个点,python无法真正做到并行,只是并发(伪并行,一起启动,但不能一起执行),但是我们要注意的是GIL只是python解释器内核级的锁,解释器上层还有用户层,用户层面python也提供了lock类,因为GIL的存在只是相当于把多核变成了单核,但无论多核还是单核,对于操作共有资源,并发操作,存在资源竞争的话就几乎会有锁的应用,不然数据混乱往往就会发生在线程切换时,每个线程看到的资源都会不一样了,所以在单核时代多线程也是会加锁的.

xpath是一种技术,是一种语言规则,通过使用这种语言规则可以使得在解析页面的时候可以类似js那样通过Dom对象来获取前端页面中的各个节点,以此来获取节点中的数据,xpath就封装在lxml的模块中,可以通过pip install lxml来导入模块,BeautifulSoup用户友好型较好,但是就性能而言xpath是用c语言实现的,BeautifulSoup是用python实现的,xpath在速度上是有优势,而且BeautifulSoup是基于Dom解析的,是把整个文档数加载进内存的,占用内存资源,查找起来耗时.


sudo pip install --ignore-installed tornado

2.str转bytes叫encode,bytes转str叫decode,如上面的代码就是将抓到的字节流给decode成unicode数组

我根据上面的错误信息分析了字节流中出现\xbb的地方,发现有个\xc2\xbb的特殊字符?,我怀疑是它无法被解码。

用以下代码测试后

print(b'\xc2\xbb'.decode('utf-8'))

它果然报错了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

上网找了下utf-8编码表,发现的确特殊字符?的utf-8形式就是c2bb,unicode是'\u00bb',为什么无法解码呢。。。

仔细看看错误信息,它提示'gbk'无法encode,但是我的代码是utf-8无法decode,压根牛头不对马嘴,终于让我怀疑是print函数出错了。。于是立即有了以下的测试

print('\u00bb')

结果报错了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

原来是print()函数自身有限制,不能完全打印所有的unicode字符。

知道原因后,google了一下解决方法,其实print()函数的局限就是Python默认编码的局限,因为系统是win7的,python的默认编码不是'utf-8',改一下python的默认编码成'utf-8'就行了

复制代码

import io

import sys

import urllib.request

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

res=urllib.request.urlopen('http://www.baidu.com')

htmlBytes=res.read()

print(htmlBytes.decode('utf-8'))

你可能感兴趣的:(多线程)