zoukankan      html  css  js  c++  java
  • 线程数据不安全现象

    线程数据不安全现象

    from threading import Thread
    n = 0
    def add():
        for i in range(500000):
            global n
            n += 1
    def sub():
        for i in range(500000):
            global n
            n -= 1
    
    t_l = []
    for i in range(2):
        t1 = Thread(target=add)
        t1.start()
        t2 = Thread(target=sub)
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    #结果n不为0
    
    from threading import Thread
    import time
    n = []
    def append():
        for i in range(500000):
            n.append(1)
    def pop():
        for i in range(500000):
            if not n:
                time.sleep(0.0000001)
            n.pop()
    
    t_l = []
    for i in range(20):
        t1 = Thread(target=append)
        t1.start()
        t2 = Thread(target=pop)
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    #使用append pop方法数据安全
    
    += -=  *= /= while if 数据不安全   + 和 赋值是分开的两个操作
    append pop strip数据安全 列表中的方法或者字典中的方法去操作全局变量的时候 数据安全的
    线程之间也存在数据不安全
    

    线程锁

    from threading import Thread,Lock
    n = 0
    def add(lock):
        for i in range(500000):
            global n
            with lock:
                n += 1
    def sub(lock):
        for i in range(500000):
            global n
            with lock:
                n -= 1
    
    t_l = []
    lock = Lock()
    for i in range(2):
        t1 = Thread(target=add,args=(lock,))
        t1.start()
        t2 = Thread(target=sub,args=(lock,))
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    
    from threading import Thread,Lock
    import time
    n = []
    def append():
        for i in range(500000):
            n.append(1)
    def pop(lock):
        for i in range(500000):
            with lock:
                if not n:
                    time.sleep(0.0000001)    # 强制CPU轮转
                n.pop()
    
    t_l = []
    lock = Lock()
    for i in range(20):
        t1 = Thread(target=append)
        t1.start()
        t2 = Thread(target=pop,args=(lock,))
        t2.start()
        t_l.append(t1)
        t_l.append(t2)
    for t in t_l:
        t.join()
    print(n)
    
    不要操作全局变量,不要在类里操作静态变量
    += -= *= /= if while 数据不安全
    queue logging 数据安全的
    

    单例模式

    import time
    class A:
        from threading import Lock
        __instance = None
        lock = Lock()
        def __new__(cls, *args, **kwargs):
            with cls.lock:
                if not cls.__instance:
                    time.sleep(0.000001)   # cpu轮转
                    cls.__instance = super().__new__(cls)
            return cls.__instance
    
    def func():
        a = A()
        print(a)
    from threading import Thread
    for i in range(10):
        Thread(target=func).start()
    
  • 相关阅读:
    libevent的问题
    mysql homedir迁移
    mysql海量数据的优化
    Spark(Hive) SQL中UDF的使用(Python)【转】
    Spark SQL inferSchema实现原理探微(Python)【转】
    Spark SQL利器:cacheTable/uncacheTable【转】
    Spark使用CombineTextInputFormat缓解小文件过多导致Task数目过多的问题【转】
    ExecutorService-10个要诀和技巧【转】
    漫游Kafka之过期数据清理【转】
    kafka多线程消费及处理和手动提交处理方案设计[转]
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13379849.html
Copyright © 2011-2022 走看看