线程代码
线程是能直接被cpu执行的最小的单位
一个进程里面最少要有一条主线程,线程与线程之间的数据是共享的,
线程的执行效率远高于进程
主线程结束了那么这个进程就结束了
线程的开启方法和进程是一样的
from threading import Thread def dunc(): print('子线程') for i in range(5): t = Thread(target=dunc) t.start()
线程为了保护数据安全性,底层给他做了个全局解释器锁,这个锁让线程在同一时刻统一进程内只会有一个线程能被cpu执行,但是解释器在分析Python代码的时候,一行代码是会分成很多行来识别的
如下图
可能cpu在执行把数据改完了再放回去的那行代码的时候,忽然时间片到了,要去执行下一个任务了,另一个任务也是相同的代码,同样拿取数据,,更改数据,再放回数据,导致两个线程执行了同一个数据,同时更改了同一个数据,再放回去了,本来是要对这个数据操作两次的,因为数据的不安全性,导致数据被不同两个cpu执行了相同的代码,所以这时候我们就需要用到线程锁
import time import json from threading import Thread,Lock def Inquiry_ticket(): with open('id_ku','r')as f: ticket = json.load(f) print('还有余票%s张'%ticket['count']) def buy_ticket(lock): lock.acquire() with open('id_ku','r') as f: ticket = json.load(f) time.sleep(5) if ticket['count'] > 0: with open('id_ku','w')as f1: ticket = json.load(f1) ticket['count'] -= 1 json.dump(ticket,f1) print('买到票了') lock.release() lock = Lock() t = Thread(target=Inquiry_ticket) t.start() t1 = Thread(target=buy_ticket,args=(lock,)) t1.start()
上面就是用一个线程实现的一个抢票代码大家可以看一下