使用多线程处理技术,可以有效的实现程序并发,优化处理能力。虽然进程也可以在独立的内存空间并发执行,
但是生成一个新的进程必须为其分配独立的地址空间,并维护其代码段,堆栈段和数据段等,这种开销是很昂贵的。
其次,进程间的通信实现也是不太方便。而线程能更好的满足要求。
线程是轻量级的,一个进程中的线程使用同样的地址空间,且共享许多资源。
启动线程的事件远远小于启动进程的事件和空间。同时,线程间的切换要比进程间切换快得多。
由于使用了同样的地址空间,所以在通信上,更加方便。一个进程下的线程之间可以直接使用彼此的数据
多线程使用的一个重要目的:最大化CPU的资源利用,当某一线程在等待I/O时,另一个线程可以占用CPU资源。
多线程无论在GUI,网络还是嵌入式上的应用都是非常多的。一个简单的GUI程序,分为前台交互,和后台的处理。可以采用多线程模式
线程的状态:
(1)就绪状态:线程已经获取了处CPU外的其他资源,正在参与调度,等待被执行。当被调度选中后,将立即执行。
(2)运行状态:获取CPU资源,正在系统中运行。
(3)休眠状态:暂时不参与调度,等待特定的事件发生,如I/O事件。
(4)中止状态:线程已经结束运行,等待系统回收线程资源。
全局解释器锁:
python使用全局解释器锁GIL来保证在解释器中仅仅只有一个线程(缺点:不能很好利用CPU密集型),并在各个线程之间切换。当GIL可用的使用,处于就绪状态的线程在获取GIL后就可以运行了。
线程将在指定的间隔时间内运行。当事件到期后,重新进入就绪状态排队等候。(除了时间到期,像是信号灯特定事件也可以是正在运行的线程中断)
线程模块:
thread和threading两种。推荐threading模块。thread模块仅仅提供了一个最小的线程处理功能集。threading是一个高级的线程处理模块,大部分应用实现都是基于他
使用thread模块(简单了解,直接使用不多,但是threading也是基于他的,所以有必要了解)
由于大部分程序不需要有多线程处理的能力,所以在python启动时并不支持多线程。也就是说,python中支持多线程所需要的各种数据结构,特别是GIL还没有创建。(只有一个主线程<一个线程可以完成>,这样会使系统处理更加高效)。若是想要使用多线程,需要调用thread.start_new_thread等方法去通知python虚拟机去创建相关的数据结构和GIL
import _thread as thread
import time
def work(index,create_time): #具体的线程
print(time.time()-create_time,"\t\t",index)
print("thread %d exit"%index)
if __name__ == "__main__":
for index in range(5):
thr1 = thread.start_new_thread(work, (index,time.time()))
# time.sleep(5)
print("Main thread exit")
![]()
Main thread exit
0.003000497817993164 0
thread 0 exit
0.002500295639038086 3
主线程未使用sleep进行阻塞,子线程不一定会全部执行