线程代码

线程是能直接被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()

上面就是用一个线程实现的一个抢票代码大家可以看一下

posted @ 2019-03-02 21:56  baby12138  阅读(289)  评论(0编辑  收藏  举报