• 线程代码


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

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

  • 相关阅读:
    TI CC2541的整体目标
    TI CC2541的GPIO引脚设置.
    E2PROM与Flash的引脚图
    TI BLE CC2541的通讯协议.
    TI BLE CC2541的I2C主模式
    Charles如何抓取电脑上的请求的https数据包
    Charles如何抓取手机上的请求的https数据包
    谷歌浏览器chrome调试H5页面 如果添加cookie?
    Unity 好坑的Save Scene
    Unity 官网教程 -- Multiplayer Networking
  • 原文地址:https://www.cnblogs.com/baby12138/p/10463192.html
Copyright © 2020-2023  润新知