zoukankan      html  css  js  c++  java
  • 线程代码

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

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

  • 相关阅读:
    javascript js 内存泄露
    javascript js 内存泄露工具使用
    逻辑运算符及按位或与非比较难理解先放着87
    //测试全局变量及局部变量的输出结果的异同
    域名被墙原因
    编写转义字符:78页
    1.1-java创建包和类的方法
    浏览器方法及代码打包成APP的
    一个简单的jsp+servlet实例,实现简单的登录
    LeetCode.985-查询后偶数的总和(Sum of Even Numbers After Queries)
  • 原文地址:https://www.cnblogs.com/baby12138/p/10463192.html
Copyright © 2011-2022 走看看