为什么说python线程是伪线程?
但是在python中,python虚拟机要求在主循环中同时只能有一个控制线程在运行,这也就意味着即使python解释器中可以运行多个线程,但是在任意时刻只有一个线程会被python解释器执行。
而这正是由**GIL(全局解释器锁)**来控制的,它保证了同一时刻只能有一个线程运行,而在python多线程环境下,python虚拟机按照下面的 方式运行:
-
设置GIL
-
切换进一个线程取运行
-
执行下面操作之一:
- 执行指定数量的字节码指令
- 线程主动让出控制权(time.sleep())
-
把线程设置会睡眠状态(切换出线程)
-
解锁GIL
-
重复以上步骤
这也就是为什么说python的多线程适合于IO密集型,而不适合计算密集型任务。
什么是守护线程
守护线程可以视为其余非守护线程的保姆,只有所有非守护线程都退出了,守护线程才会终止。
threading模块支持守护线程,其工作方式是:守护线程一般是一个等待客户端请求服务的服务器。如果没有客户端请求,守护线程就是空闲的。
python中的多线程
python中提供了很方便的库来提供多线程,该库就是Threading库。
Threading.Thread类
首先我们先来介绍一下它的初始化函数,再来介绍它的相关属性,最后,我们介绍它常用的一些方法。
###__init__
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
- group: 预留参数,用于扩展
- target: run()方法所调用的函数,默认为None。
- name: 线程名字,默认为" Thread-N"