python多线程可以通过导入thread模块,来使用thread中的函数,或者通过继承threading类来创建线程。
每个进程都拥有自己的地址空间,内存,数据栈以及记录其运动轨迹的辅助数据。
python代码的执行主要由python虚拟机(也叫解释器GIL主循环)来控制,对python虚拟机的访问由python全局解释器锁GIL来控制,正是这个锁保证了任一时刻只有一个线程在运行。
不建议使用thread模块的原因:这样做有很多原因,很明显的一个原因是,当主线程退出的时候,所有其它线程没有被清除就退出了。但另一个模块 threading 就能确保所有“重要的”子线程都退出后,进程才会结束。threading比thread更加高级。
另一个不要使用 thread 原因是,对于你的进程什么时候应该结束完全没有控制,当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作。我们之前说过,至少threading 模块能确保重要的子线 程退出后进程才退出。
python 3.3中使用import thread会报错,这是因为没有打开线程支持,需要重新编译python解释器才能运行。
python提供了几个多线程编程的模块:thread、threading、queue
表 18.1 thread 模块和锁对象
函数 描述
thread 模块函数
start_new_thread(function, args, kwargs=None) 产生一个新的线 程,在新线程中用指定的参数和可的kwargs
来调用这个函数。参数args是函数function的参数
allocate_lock() 分配一个 LockType 类型的锁对象
exit() 让线程退出
LockType类型锁对象方法
acquire(wait=None) 尝试获取锁对象
locked()
如果获取了锁对象返回 True,否则返回 False
release()
释放锁
其中start_new_thread函数要求一定要有前两个参数,即使运行的函数不需要参数,也要传入一个空的元组
表 18.2 threading 模块对象
threading 模块对象 描述
Thread 表示一个线程的执行的对象
Lock 锁原语对象(跟 thread 模块里的锁对象相同)
RLock 可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定)。
Condition 条件变量对象能让一个线程停下来,等待其它线程满足了某个“条件”。如,状态的改变或值的改变。
Event 通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活。
Semaphore 为等待锁的线程提供一个类似“等候室”的结构
BoundedSemaphore 与 Semaphore 类似,只是它不允许超过初始值
Timer 与 Thread 相似,只是,它要等待一段时间后才开始运行。
守护线程:守护线程是一个等待客户请求的服务器,在主线程运行的时候不用等待守护线程的退出就可以退出,设置守护线程:在thread.start()之前调用setDaemon设定线程为守护线程
实例化一个 Thread(调用 Thread())与调用 thread.start_new_thread()之间最大的区别就
是,新的线程不会立即开始。