同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作;cpu执行的都是线程,默认程序会开一个主线程;进程是程序以及和程序相关资源的集合;某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明
简单的多线程
import threading, time def test1(x): time.sleep(5) print(x**x) #下面定义两个线程调用test1这个函数,创建多线程使用如下语法,target后面跟函数名,args传递实参,实参需要以元组形式传递 start_time = time.time() t1 = threading.Thread(target=test1, args=(5,)) t2 = threading.Thread(target=test1, args=(6,)) #启动多线程 t1.start() t2.start() end_time = time.time() total_time = end_time - start_time print("two Thread used %s time"%total_time) #由于使用多线程,t1 t2启动以后并不会等待期执行完程序才继续往后走,因为主程序就是主线程和t1 t2是并行执行的,主程序执行到此t1 t2并未运行完成 time.sleep(6) #多线程启动数量比较多时可以使用for循环,多线程并行执行,打印的结果有可能不是按照启动顺序来打印的 for i in range(5): t3 = threading.Thread(target=test1, args=(i,)) t3.start() time.sleep(6)
主线程等待非主线程执行完毕才继续执行 join方法
#有些情况主线程需要子线程执行完毕后,有可能是将数据处理完毕后才执行接下来的主线程的东西 start_time1 = time.time() tl = [] #将多线程的对象存起来,用于后面join方法 for i in range(5): t4 = threading.Thread(target=test1, args=(i,)) t4.start() tl.append(t4) for t in tl: #将多线程并发join,参加join的子线程执行完毕后才继续执行下面的主线程。 t.join() end_time1 = time.time() total_time1 = end_time1 - start_time1 print(total_time1) #此次执行时间大约就是5s
#如果多个子线程一些join一些没有join主线程怎么处理???部分子线程join主线程会等join时间最长的子线程结束后才继续,未参与join的子线程仍然和主线程并行运行 t5 = threading.Thread(target=test1, args=(5,)) t6 = threading.Thread(target=test1, args=(6,)) t5.start() t6.start() t5_join_start_time = time.time() t5.join() time.sleep(10) t5_join_end_time = time.time() print("t5 join time is %s"%(t5_join_end_time - t5_join_start_time)) #实际耗时15s
守护线程 setDeamon
#守护进程,即主线程结束以后所有的其它线程也立即结束,不用等其它线程执行完毕;正常情况即使没加join主线程执行完毕当其它线程未执行完毕程序也不会退出,必须等待所有线程执行完毕程序才结束,类似主程序在末尾有默认的join def test1(x): time.sleep(5) print("i an other Thread",x**x) for i in range(5): t = threading.Thread(target=test1, args=(i,)) t.setDaemon(True) t.start() print("Main Thread is done") #整个程序结束,不会等待守护线程打印操作执行完毕就直接结束了
递归锁 Rlock
#递归锁,一个锁里面嵌套着锁,如果不使用递归锁会导致释放锁逻辑错误,整个程序就跑偏了;使用递归锁后程序会维护一个加锁 解锁的数据结构,保证释放锁不会出问题 lock = threading.Lock() def test2(): lock.acquire() print("this is test2") lock.release() def test3(): lock.acquire() print("this is test3") lock.release() def test4(): lock.acquire() test2() print("this is test4") test3() lock.release() rlock_test = threading.Thread(target=test4) rlock_test.start() while threading.active_count() != 1: print("current thread count is",threading.active_count()) #整个程序一直在打印有两个线程,非主线程的锁嵌套出问题导致无法退出,整个程序卡死 time.sleep(1)
将lock = threading.Lock()修改为lock = threading.RLock()整个程序就能正常结束;正常结束的输出如下
this is test2
this is test4
current thread count is 2
this is test3
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]