1、demo
第一个代码是多线程的简单使用,编写了线程如何执行函数和类。
import threading import time class ClassName(threading.Thread): """创建类,通过多线程执行""" def run(self): for i in range(5): print(i) time.sleep(1) def sing(): for i in range(1,11): print("唱歌第 %d 遍" % i) time.sleep(1) def dance(): for i in range(1,16): print("跳舞第 %d 遍" % i) time.sleep(1) def main(): t1 = threading.Thread(target = sing) t2 = threading.Thread(target = dance) t = ClassName() # 启动线程 t1.start() t2.start() t.start() while True: length = len(threading.enumerate()) print("正在运行的线程有 %s" %threading.enumerate()) if length <= 1: break time.sleep(1) if __name__ == '__main__': main()
执行结果可以看到函数 sing、dance和类在同时执行,执行效果太长就不方截图了
2、多线程共享变量
通过定义全局变量,然后再test1函数类部进行更改全局变量,test2打印全局变量。
import threading import time #定义全局变量 g_num = 0 def test1(): """函数test1对全局变量进行更改""" global g_num for i in range(1,10): g_num += 1 print("--- test1 线程 g_num = %d--- " % g_num) def test2(): """函数test2 打印全局变量""" print("--- test2 线程 g_num = %d--- " % g_num) def main(): t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) # 启动线程 t1.start() # 增加睡眠是为了保证优先执行函数test1 time.sleep(1) t2.start() print("--- 主线程 g_num = %d--- " % g_num) if __name__ == '__main__': main()
执行结果可以看出,在主线程和创建的两个线程中读取的是一样的值,既可以表明在多线程中变量共享
3、资源竞争
在多线程两个函数中同时更改一个变量时,由于cpu的计算能力,当修改参数的代码块无法一次性执行完成时,就会产生资源竞争
import threading import time # 定义全局变量 g_num = 0 def test1(num): """函数test1对全局变量进行更改""" global g_num for i in range(num): g_num += 1 print("test1 线程 g_num = %d---" % g_num) def test2(num): """函数test2对全局变量进行更改""" global g_num for i in range(num): g_num += 1 print("tes2 线程 g_num = %d---" % g_num) def main(): t1 = threading.Thread(target=test1, args=(1000000, )) t2 = threading.Thread(target=test2, args=(1000000, )) t1.start() t2.start() time.sleep(1) print("主线程 g_num = %d---" % g_num) if __name__ == '__main__': main()
可以先试试传递参数为100时,可以看到g_num = 200 这是因为函数代码可以一次性执行完成,当参数为1000000时代码无法一次性执行完成,g_num!= 2000000
4、互斥锁
互斥锁可以解决资源竞争的问题,原理很简单,通过对代码块上锁,保证该代码执行完成前,其它代码无法进行修改。执行完成后解锁,其它代码就可以执行了。
import threading import time # 创建变量 g_num = 0 # 创建锁默认为开锁状态 mutex = threading.Lock() def test1(num): global g_num for i in range(num): # 上锁 mutex.acquire() g_num += 1 # 解锁 mutex.release() print("--- test1 线程 g_num = %d---" % g_num) def test2(num): global g_num for i in range(num): # 上锁 mutex.acquire() g_num += 1 # 解锁 mutex.release() print("--- test2 线程 g_num = %d---" % g_num) def main(): t1 = threading.Thread(target=test1, args=(1000000, )) t2 = threading.Thread(target=test2, args=(1000000, )) t1.start() t2.start() time.sleep(1) print("--- 主线程 g_num = %d---" % g_num) if __name__ == '__main__': main()
可以看到加了锁之后,代码执行不会出现资源竞争,结果也是正常的。互斥锁,上锁的代码越少越好。
5、死锁
当出现多个锁时,就可能会产生死锁这个情况。当关闭一个锁时,这个锁已经为关闭状态的话,程序就会阻塞。就如同下面这个代码中。函数test1关闭mutexB锁时,函数test2提前将其关闭了,未进行解锁,程序就会一直阻塞。
import threading import time # 创建两个锁A, B mutexA = threading.Lock() mutexB = threading.Lock() def test1(): # 对muctexA上锁 mutexA.acquire() # mutexA上锁后,延时1秒,等待mutexB上锁 print("test1 ---do1---up---") time.sleep(1) # 此时会堵塞,因为mutexB已经上锁 mutexB.acquire() print("test1 ---do1---down---") mutexB.release() # 对mutexA解锁 mutexA.release() def test2(): # 对muctexB上锁 mutexB.acquire() # mutexB上锁后,延时1秒,等待mutexA上锁 print("test2 ---do1---up---") time.sleep(1) # 此时会堵塞,因为mutexB已经上锁 mutexA.acquire() print("test2 ---do1---down---") mutexA.release() # 对mutexA解锁 mutexB.release() def main(): t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() t2.start() if __name__ == '__main__': main()
代码执行效果可以看到程序会一直阻塞
解决方法
1、在程序编写时,就需要注意避免死锁
2、可以参考银行家算法
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 完美倒立.2024-夜色碳酸【草台回声】【FLAC分轨】
- 杨青《半山听雨贰HQ》头版限量编号[低速原抓WAV+CUE]
- 白玛多吉《云上西藏1+2》DTS-WAV
- 模拟之声慢刻CD《柏林之声3》[正版CD原抓WAV+CUE]
- 威神V(WayV)《The Highest》[FLAC/分轨][259.1MB]
- 余超颖《迷焕纪》[320K/MP3][201.15MB]
- 余超颖《迷焕纪》[FLAC/分轨][784.22MB]
- 温岚.2005-爱回温新歌加精选2CD【阿尔发】【WAV+CUE】
- 尤雅.1990-台语怀念金曲特选辑【太阳神】【WAV+CUE】
- 群星.2024-七夜雪电视剧影视原声带【听见时代】【FLAC分轨】
- 群星《胎教音乐 古典钢琴曲与水晶摇篮曲》[320K/MP3][134.14MB]
- 群星《胎教音乐 古典钢琴曲与水晶摇篮曲》[FLAC/分轨][654.13MB]
- 许惠钧《睡眠钢琴与校园民歌金曲 空灵新世纪催眠曲》[320K/MP3][201.15MB]
- wbg战队国籍分别都是哪里的 wbg战队2024阵容国籍介绍
- wbg战队教练是韩国人吗 s14wbg战队教练国籍介绍