• 线程代码


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

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

  • 相关阅读:
    CPU飙高,OOM排查?
    反射
    Mybatits
    spring 基础问题
    java中格式化数字0和#区别
    java中File对象的mkdir和mkdirs的区别
    java截取字符串几种方式
    java工厂模式
    Java获取文件路径的几种方式
    jxl生成excel时,增加批注和冻结窗口
  • 原文地址:https://www.cnblogs.com/baby12138/p/10463192.html
Copyright © 2020-2023  润新知