多线程
•线程:实现多任务的另一种方式
•一个进程中,也经常需要同时做多件事,就需要同时运行多个‘子任务’,这些子任务,就是线程
•线程又被称为轻量级进程(lightweight process),是更小的执行单元
一个进程可拥有多个并行的(concurrent)线程,当中每一个线程,共享当前进程的资源
一个进程中的线程共享相同的内存单元/内存地址空间——>可以访问相同的变量和对象,而且它们从同一堆中分配对象——>通信、数据交换、同步操作
由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快
线程和进程的区别:
•进程是系统进⾏资源分配和调度的⼀个独⽴单位
•进程在执⾏过程中拥有独⽴的内存单元, ⽽多个线程共享内存, 从⽽极 ⼤地提⾼了程序的运⾏效率
•⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程
(程序要运行,实际上是线程在运行,进程用来给线程分配资源)
(进程占的是内存,线程占CPU资源)
•线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的 能独⽴运⾏的基本单位
•线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源,但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源
•线程的划分尺度⼩于进程(资源⽐进程少), 使得多线程程序的并发性⾼
•线程不能够独⽴执⾏, 必须依存在进程中
线程和进程在使⽤上各有优缺点:线程执⾏开销⼩,但不利于资源的管理和保护;⽽进程正相反
(为什么说不利于资源的管理和保护?例如:对于同一个变量,两个线程都可以操作,线程1把变量改为10,线程2 把变量改为20,那么最后这个变量的结果是什么?我们不知道,因为我们不能确定是线程1先执行还是线程2先执行,这是由系统调度实现的)
一般来讲,我们把进程用来分配资源,线程用来具体执行。(CPU调度)
•python的thread模块是⽐较底层的模块,在各个操作系统中表现形式不同(低级模块)
•python的threading模块是对thread做了⼀些包装的(封装), 可以更加⽅便的被使⽤(高级模块)
•thread 有一些缺点,在threading 得到了弥补,所以我们直接学习threading即可
import threading
if __name__ == '__main__':
#任何进程会默认启动一个线程,这个线程称为主线程,主线程可以启动新的子线程
#current_thread() 返回当前线程的实例
#.name 当前线程的名称
print("主线程%s启动"%threading.current_thread().name)#此处没有创建新的线程,返回的也就是主线程的名字
import threading,time
def saySorry():
print("子线程%s启动"%t.name)
time.sleep(1)
print("我错了")
if __name__ == '__main__':
print("主线程%s启动"%threading.current_thread().name)
for i in range(5):
t=threading.Thread(target=saySorry)#创建了一个子线程 T