python创建和执行线程
创建线程代码
1. 创建方法一:
2. 创建方法二:
进程和线程都是实现多任务的一种方式,例如:在同一台计算机上能同时运行多个QQ(进程),一个QQ可以打开多个聊天窗口(线程) 。资源共享:进程不能共享资源,而线程共享所在进程的地址空间和其他资源,同时,线程有自己的栈和栈指针 。所以在一个进程内的所有线程共享全局变量,但多线程对全局变量的更改会导致变量值得混乱 。
代码演示:
得到的结果是:
首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念 。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码 。同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行(其中的JPython就没有GIL) 。
那么CPython实现中的GIL又是什么呢?GIL全称Global Interpreter Lock为了避免误导,我们还是来看一下官方给出的解释:
主要意思为:
因此,解释器实际上被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行 。在多线程环境中,Python 虚拟机按以下方式执行:
由于GIL的存在,Python的多线程不能称之为严格的多线程 。因为多线程下每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程在运行 。
由于GIL的存在,即使是多线程,事实上同一时刻只能保证一个线程在运行,既然这样多线程的运行效率不就和单线程一样了吗 , 那为什么还要使用多线程呢?
由于以前的电脑基本都是单核CPU,多线程和单线程几乎看不出差别 , 可是由于计算机的迅速发展,现在的电脑几乎都是多核CPU了 , 最少也是两个核心数的,这时差别就出来了:通过之前的案例我们已经知道 , 即使在多核CPU中,多线程同一时刻也只有一个线程在运行 , 这样不仅不能利用多核CPU的优势,反而由于每个线程在多个CPU上是交替执行的,导致在不同CPU上切换时造成资源的浪费,反而会更慢 。即原因是一个进程只存在一把gil锁,当在执行多个线程时,内部会争抢gil锁 , 这会造成当某一个线程没有抢到锁的时候会让cpu等待,进而不能合理利用多核cpu资源 。
但是在使用多线程抓取网页内容时,遇到IO阻塞时,正在执行的线程会暂时释放GIL锁,这时其它线程会利用这个空隙时间,执行自己的代码,因此多线程抓取比单线程抓取性能要好,所以我们还是要使用多线程的 。
GIL对多线程Python程序的影响
程序的性能受到计算密集型(CPU)的程序限制和I/O密集型的程序限制影响,那什么是计算密集型和I/O密集型程序呢?
计算密集型:要进行大量的数值计算,例如进行上亿的数字计算、计算圆周率、对视频进行高清解码等等 。这种计算密集型任务虽然也可以用多任务完成,但是花费的主要时间在任务切换的时间,此时CPU执行任务的效率比较低 。
IO密集型:涉及到网络请求(time.sleep())、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度) 。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度 。
当然为了避免GIL对我们程序产生影响,我们也可以使用,线程锁 。
LockRLock
常用的资源共享锁机制:有Lock、RLock、Semphore、Condition等 , 简单给大家分享下Lock和RLock 。
Lock
特点就是执行速度慢,但是保证了数据的安全性
RLock
推荐阅读
- 手柄赛车游戏,手柄赛车游戏叫什么
- 1155什么cpu好,1155cpu推荐
- 微网站的制作,微网站制作开发
- php增加某一列数据 php添加
- 怎么进入redis界面,如何进入redis数据库
- php数据库行锁,php数据库设计
- vb.net数据库编程 vb数据库开发实例视频教程
- jqueryflot柱状图,html柱状图插件
- 家庭如何融入互联网营销,家庭如何融入互联网营销工作