上一接 我留一个问题,为什么 全局变量每次运行的结果不一样 ? 当计算的值越大出错的概率越大。
因为多线程会有同时抓到全局变量修改,没有按照顺序同步
解析错误过程
比如 线程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