python高级进阶_25_避免并发引起的问题(全局变量计算错误)01

上一接 我留一个问题,为什么 全局变量每次运行的结果不一样 ? 当计算的值越大出错的概率越大。

因为多线程会有同时抓到全局变量修改,没有按照顺序同步

解析错误过程

比如 线程1 找到的 全局变量为 1开始 +1, 线程2 也找到了全局变量 为1 也开始+1,
线程1 把计算的结果 2 赋值给 全局变量结果为2, 线程二 也开始把计算的结果为2赋值给全局变量2

解决方法

知道了错误过程,应该怎么解决呢,怎么解决他们同时赋值?

答: 让他们按照顺序执行, 线程1 执行完,你再执行 一定不会有错误

我们暂时用两个方法解决

用sleep方法

代码如下:

import threading ,time

class MyThread(threading.Thread):

    def run(self):
        for i in range(100000):
            global num
            num += 1

if __name__=='__main__':
    num = 0
    for i in range(2):
        t=MyThread()
        t.start()
        time.sleep(1)   # 当线程1 执行的时候 ,休息 1s ,达到了时间隔离。
    print(num)

这种方法不是合理, 你不知道休息多久, 这个不好判断。

用判断条件决定线程的执行

这种方式叫 轮询 , 代码如下:

import threading ,time

def work1():
    global g
    global num
    if g == 0:                 # 当条件满足的执行 执行  
        for i in range(100000):
            num += 1
        g=1                     # 执行后,标识位变化,让其他线程执行
        print("work"+str(num) )
def work2():
    global num
    global g
    while True:  # 死循环 等待条件满足 
        if g != 0:
            for i in range(100000):
                num += 1         
            break  # 执行完结束 ,切断循环
    print("work2 %s"%num)
if __name__=='__main__':
    num=0
    g=0
    t1 = threading.Thread(target=work1)
    t1.start()     #线程1 运行 
    t2 = threading.Thread(target=work2)
    t2.start() # 线程2 运行  

打印结果为:

work100000
work2 200000

总结:

sleep 灵活性 不高, 你不好拿捏需要sleep 多久

条件判断虽然灵活性高, 缺点 在死循环的时候占用CPU 资源。

一般会用下节介绍的 互斥锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值