目录python
线程与进程都是虚拟单位,目的是为了更好的描述某种事物安全
进程:资源单位并发
线程:执行单位ui
开启一个进程,必定会有一个线程,线程才是真正的执行者线程
# coding=utf-8 from threading import Thread from threading import current_thread import time ''' 开启线程方式1: ''' def task(): print(f"{current_thread().name} 线程开启") time.sleep(1) print(f"{current_thread().name} 线程结束") if __name__ == '__main__': for i in range(3): t = Thread(target=task) t.daemon = True t.start() # 判断子线程是否存活 print(t.is_alive()) print(t.isAlive()) print("主|") ''' 开启线程方式2: ''' class MyThread(Thread): def run(self): print(f"{current_thread().name} 线程开启") time.sleep(1) print(f"{current_thread().name} 线程结束") if __name__ == '__main__': t = MyThread() t.start() Thread-1 线程开启 True True Thread-2 线程开启 True True Thread-3 线程开启 True True 主|
线程对象的属性:code
current_thread().name:表示当前线程的名字
对象
t.daemon = True:线程的守护进程 跟着主线程一块儿死掉
队列
t.is_alive() or t.isAlive():判断子线程是否存活
进程
t.join():等待子线程结束
内存
节省内存资源
开启进程:会开辟一个名称空间,每开启一个进程都会占用一分内存资源
,会自带一个线程
开启线程:一个进程能够开启多个线程,线程的开销远小于进程
注意:进程不能实现并行,线程只能实现并发,进程能够实现并行
比喻:内存就像一个工厂,子进程就像是一个个工厂车间,线程就像车间内的流水线
线程互斥锁
# coding=utf-8 from threading import Thread,current_thread,Lock import time n = 100 ''' 线程中数据时共享的,若是不加锁,那么每一个线程抢到的资源都将是同一个,则不能保证数据的安全 ''' def task(i,mutex): print(f"线程 {current_thread().name} 启动") global n # 添加线程互斥锁 mutex.acquire() temp = n time.sleep(0.1) n = temp - 1 # 释放互斥锁 mutex.release() print(f"线程 {current_thread().name} 结束") # print(n) if __name__ == '__main__': mutex = Lock() for i in range(10): t = Thread(target=task,args=(i,mutex)) t.start() t.join() print(n) 线程 Thread-1 启动 线程 Thread-1 结束 线程 Thread-2 启动 线程 Thread-2 结束 线程 Thread-3 启动 线程 Thread-3 结束 线程 Thread-4 启动 线程 Thread-4 结束 线程 Thread-5 启动 线程 Thread-5 结束 线程 Thread-6 启动 线程 Thread-6 结束 线程 Thread-7 启动 线程 Thread-7 结束 线程 Thread-8 启动 线程 Thread-8 结束 线程 Thread-9 启动 线程 Thread-9 结束 线程 Thread-10 启动 线程 Thread-10 结束 90