线程
-
什么是线程
-
线程的创建开销小
-
线程与进程的区别
-
为何要用多线程
-
多线程的应用举例
-
开启线程的两种方式
-
在一个进程下开启多个线程与在一个进程下开启多个子进程的区别
-
多线程并发的socket服务器
-
线程相关的其他方法
-
守护线程
- 同步锁
-
死锁现象与递归锁
-
信号量Semaphore
- Event
-
定时器
-
线程queue
一 什么是线程
在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程
注意:进程是资源分配的最小单位,线程是CPU调度的最小单位.
线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程
车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线
流水线的工作需要电源,电源就相当于cpu
所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。
多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。
二 线程的创建开销小
创建一个进程,需要向操作系统申请一块内存空间然后把一些列资源放进去。
创建一个线程,无需向操作系统申请内存空间,直接用进程的资源,所以效率会高很多。
三 线程与进程的区别
1.线程共享创建它的进程的地址空间;进程有自己的地址空间。
2.线程可以直接访问其进程的数据段;进程拥有自己父进程数据段的副本。
3.线程可以直接与其进程的其他线程通信;进程必须使用进程间通信来与兄弟进程通信。
4.新线程很容易创建;新进程则需要复制父进程的数据段。
5.线程可以对同一进程的线程进行相当大的控制;进程只能控制子进程。
6.对主线程的更改(取消,优先级更改等)可能会影响进程的其他线程的行为;对父进程的修改不会影响子进程。
四 为何要用多线程
多线程指的是,在一个进程中开启多个线程,简单的讲:如果多个任务共用一块地址空间,那么必须在一个进程内开启多个线程。详细的讲分为4点:
1. 多线程共享一个进程的地址空间
2. 线程比进程更轻量级,线程比进程更容易创建可撤销,在许多操作系统中,创建一个线程比创建一个进程要快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用
3. 若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序执行的速度。
4. 在多cpu系统中,为了最大限度的利用多核,可以开启多个线程,比开进程开销要小的多。(这一条并不适用于python)
五 多线程的应用举例
开启一个字处理软件进程,该进程肯定需要办不止一件事情,比如监听键盘输入,处理文字,定时自动将文字保存到硬盘,这三个任务操作的都是同一块数据,因而不能用多进程。只能在一个进程里并发地开启三个线程,如果是单线程,那就只能是,键盘输入时,不能处理文字和自动保存,自动保存时又不能输入和处理文字。
六 开启线程的两种方式
multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性。
#方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t=Thread(target=sayhi,args=('egon',)) t.start() print('主线程')