当前位置: 首页 > 后端技术 > Python

Python多任务编程-线程间共享变量

时间:2023-03-26 14:35:19 Python

问题:线程间共享全局变量数据报错importthreadingg_num=0deftask1():foriinrange(1000000):globalg_numg_num+=1print('TASK1:',g_num)deftask2():foriinrange(1000000):globalg_numg_num+=1print('TASK2:',g_num)if__name__=="__main__":first=threading.Thread(target=task1)second=threading.Thread(target=task2)first.start()second.start()运行结果:理论上实现循环100万次,每循环一次全局变量加1,最终结果应该是2,000,000。实际结果如上图所示。原因:两个线程同时对全局变量进行操作。当线程1读取全局变量时,线程2也读取了全局变量。对变量进行操作时,读取的是原始变量,而不是操作变量。因为线程1没有提交对变量的操作,所以线程2也读取了之前的变量值。解决方案是使用进程同步来保证同一时刻只有一个线程对数据进行操作。1.使用join()方法importthreadingg_num=0deftask1():foriinrange(1000000):globalg_numg_num+=1print('TASK1:',g_num)deftask2():foriinrange(1000000):globalg_numg_num+=1print('TASK2:',g_num)if__name__=="__main__":first=threading.Thread(target=task1)second=threading.Thread(target=task2)first.start()首先。join()second.start()执行结果:原理:添加了first.join()线程等待程序运行,第二个线程要等到第一个线程运行完才会开始运行,保证只有一个线程执行变量同时运行。线程同步:一个任务执行完后,可以执行另一个任务。同时,只有一个任务在执行。2.Muteximportthreadingg_num=0#创建互斥锁本质上是一个函数通过LOCK=threading.Lock()deftask1():#lockLOCK.acquire()foriinrange(1000000):globalg_numg_num+=1print('TASK1:',g_num)#释放电缆LOCK.release()deftask2():LOCK.acquire()foriinrange(1000000):globalg_numg_num+=1print('TASK2:',g_num)LOCK.release()if__name__=="__main__":first=threading.Thread(target=task1)second=threading.Thread(target=task2)first.start()second.start()执行结果:原理:锁定共享数据,同一时间只能一个线程操作,多个线程可以一起抢,抢到的先使用threading中的锁函数。运行第一个线程时,先使用lock.acquire()锁住当前线程。在此期间,其他线程不能运行。当循环结束时,使用lock.release()释放当前线程,其他线程就可以操作了。确保只有一个线程可以同时执行。但是,互斥体在一定程度上影响了代码的效率,将多任务变成了单任务执行,也有可能造成死锁问题(锁没有及时释放造成的)。