网站和平台是一个意思吗外贸推广如何做
资源竞争解决办法:
1.线程等待 join
2.互斥锁
同步:
线程同步:目的是按顺序进行
线程等待:
from threading import Thread,Lock a=0 b=1000000#解决办法一 def sum1():for i in range(b):global a #a为整型,修改值时引用地址会改变,需声明a+=1print(f'第一次:{a}\n',end='')def sum2():for i in range(b):global a #a为整型,修改值时引用地址会改变,需声明a+=1print(f'第二次:{a}\n',end='')if __name__ == "__main__":# 创建线程thread = Thread(target=sum1)thread1 = Thread(target=sum2)# 启动线程thread.start()thread.join()thread1.start()# 等待线程结束# thread.join()# thread1.join()
互斥锁:能够保证多个线程访问共享数据不会出现数据错误问题,对共享数据进行锁定,保证同一时刻只能有一个线程操作
互斥锁的使用:
1.threading模块中定义Lock() 锁
2.acquire 加锁 release 释放锁
3.如果在调用acquire方法时,其他线程已经使用了这个互斥锁,那么此时acquire方法会堵塞,知道这个互斥锁释放后才能再次上锁
4.Lock有acquire()和release(),成对出现的,先加锁释放锁才能再加锁等操作,否则会造成死锁
from threading import Thread,Lock a=0 b=1000000#解决办法一 #1.创建全局互斥锁 lock=Lock()def sum1():lock.acquire()#加锁for i in range(b):global a #a为整型,修改值时引用地址会改变,需声明a+=1print(f'第一次:{a}\n',end='')lock.release()#解锁def sum2():lock.acquire()for i in range(b):global a #a为整型,修改值时引用地址会改变,需声明a+=1print(f'第二次:{a}\n',end='')lock.release()if __name__ == "__main__":# 创建线程thread = Thread(target=sum1)thread1 = Thread(target=sum2)# 启动线程thread.start()thread1.start()# 等待线程结束thread.join()thread1.join()
输出结果为:
第一次:1000000
第二次:2000000