线程:多任务的另一种方式
一个进程中,也经常需要同时做多件事,就需要同时运行多个 ‘子任务’,这些 ‘子任务’ 就是线程
线程又被称为轻量级进程(lightweight process),是更小的执行单元
1.一个进程拥有多个并行的线程,当中每个线程,共享当前线程的资源
2.一个进程中的线程共享相同的内存单元(内存地址空间),可以访问相同的变量和对象,而且它们从同一堆中分配对象(通信、数据交换、同步操作)
3.由于线程间的通信在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且传递的速度也更快
线程和进程的区别
1.进程是系统进行资源分配和调度的一个独立单位
2.进程在执行任务的过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高了程序的运行效率
3.一个程序至少有一个进程,一个进程至少拥有一个线程
4.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
5.线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可以与同属一个进程的其他线程共享进程的所有资源
6.线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高
7.线程不能独立运行,必须依存于进程
8.线程执行开销小,但不利于资源的管理和保护;进程刚好相反
多线程
python的thread模块是比较底层的模块,在各个操作系统中表现形式不同(低级模块)
python的threading模块是对thread模块的封装,可以更加方便的被使用(高级模块)
创建多线程
线程的五种状态
1.新状态:线程对象已经创建,还没有调用start方法
2.可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态;当start方法调用时,线程首先进入可运行状态,在线程运行之后或者从阻塞、等待或睡眠状态回来后,也返回到可运行状态。
3.运行状态:程序调度程序从可运行池中选择一个线程当作当前线程时线程所处的状态,这也是线程进入运行状态的唯一方式。
4.等待/组赛/睡眠状态:这是线程有资格运行时它所处的状态。实际上这三种状态组合成一种,共同点是 ‘线程仍旧是活的(可运行)’,但是当前没有条件运行;但是如果某件事件出现,它可能返回到可运行状态。
5.死亡态:当线程的run方法完成时就认为它死去了。这个线程对象也许是活的,但是它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。如果在一个死亡的线程上调用start方法,会抛出异常
多线程程序的执行循序是不确定的(操作系统决定);当执行到sleep语句是,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runable)状态,等待调度;线程调度将自行选择一个线程执行;代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定
线程共享全局变量
在一个进程内的所有线程共享全局变量,多线程之间的数据共享,缺点是可能造成多个线程同时修改一个变量(线程非安全),可能造成混乱
线程同步
1.当多个线程几乎同时修改某一个共享数据时,需要进行同步控制
2.线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁
3.互斥锁保证了每次只有一个线程进行写入操作,从而保证多线程下数据的正确性(原子性)
4.互斥锁为资源引入一个状态:锁定/非锁定;某个线程要更改共享数据时,先将其锁定,此时资源的状态为 ‘锁定’,其他线程不能更改,直到该线程释放资源,将资源的状态变为 ‘非锁定’,其他的线程才能再次锁定该资源。
5.threading模块中定义了Lock模块,可以方便的处理锁定
如果没有互斥锁,num的结果大部分是小于20000的
网友评论