• 多线程复习2


    1.全局锁 GIL 
        在任意一个指定的时间中,有且仅有一个线程在运行 -> 线程比较安全
    2.线程复杂度较高,通常不建议使用
    3.使用在 数据库线程池,数据库连接池,
    4.不要大量使用线程,修改难度稍大
    mlock = threading.Lock()
    5.互斥锁 
        加锁 acquire
            mlock.acquire()
        释放锁 release
            mlock.release()
        加锁后释放,不释放会发生死锁
        如:打开一个文件后 不希望别人修改
    6. mlock = threading.RLock()
        当存在死锁时,防止死锁  可重用锁,加锁和释放锁可以多个使用在同一个函数中
    
    程序:
    # 测试,线程是否安全
    import threading 
    
    num = 0 
    def t():
        global num 
        num += 1
        print(num)
    for i in range(0,6):
        d = threading.Thread(target = t)
        d.start()
        # 可以按序输出
    
    
    import threading 
    import time 
    
    def func_a():
        print("a 函数开始")
        time.sleep(2)
        print("a 函数结束")
    
    def func_b():
        print("b 函数开始")
        time.sleep(2)
        print("b 函数结束")
    
    b_time = time.time()
    func_a()
    func_b()
    print(time.time() - b_time)
    # 查看运行多少秒
    
    import threading 
    
    _a = threading.Thread(target = func_a)
    _b = threading.Thread(target = func_b)
    _a.start()
    _b.start()
    # 开始
    _a.join()
    _b.join()
    # 等待
    print(time.time() - b_time)
    # 查看时间
    
    # 加锁和释放
    import threading 
    mlock = threading.Lock()
    # 创建一把锁, mlock 名
    # mlock = threading.RLock()
    # 当存在死锁时,防止死锁  可重用锁
    num = 0 
    def a():
        global num
        mlock.acquire()
        # 加锁
        num += 1 
        mlock.release()
        # 释放锁
        print(num)
    for i in range(10):
        d = threading.Thread(target = a)
        d.start()

    2020-04-12

  • 相关阅读:
    VMware安装Centos7超详细过程
    LVS+Keepalived小试牛刀
    Spring入门之AOP篇
    Spring学习笔记及资源
    Spring入门第一例
    Mybatis学习手记(二)
    Mybatis学习手记(一)
    java web 开发入门实例
    关于JAVA编译时找不到自定义包的问题
    Java 学习笔记及资源
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/12686171.html
Copyright © 2020-2023  润新知