电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python多線程Threading、子線程與守護線程實例詳解

瀏覽:62日期:2022-08-01 13:48:34

本文實例講述了Python多線程Threading、子線程與守護線程。分享給大家供大家參考,具體如下:

線程與進程: 線程對于進程來說,就好似工廠里的工人,分配資源是分配到工廠,工人再去處理。 線程是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。 在單個程序中同時運行多個線程完成不同的工作,稱為多線程 對于IO密集型的程序來說,多線程可以利用讀IO的時間去做其他事【IO并不占用CPU,這就好像A買個一份外賣,他只需要等著送過來然后敲A家的門就行了】; 而對于CPU密集型的程序來說,多線程的效率就不是很高了【CPU由于要計算,切換之間要恢復之前的現場消耗相對較大,比如我同時做幾份作業,一份作業做十分鐘,假如十分鐘做不完一份作業,那么我后面再回頭做的時候,我就要好好想想剛才做到哪,剛才想到哪】

補充:IO需要CPU嗎?知乎:https://www.zhihu.com/question/27734728

Python多線程Threading、子線程與守護線程實例詳解

線程Threading:

python中多線程需要使用threading模塊

線程的創建與運行:

1.直接調用threading的Thread類:

線程的創建:線程對象=thread.Thread(target=函數名,args=(參數))【補充,由于args是一個元組,單個參數時要加“,”】

線程的啟動:線程對象.start(),調用start(),那么線程對象會自動去調用thread.Thread中的run()

讓主線程等待其余線程結束:線程對象.join(),加了join之后,相當于阻塞了主線程,主線程只有當join的線程結束后才會向下執行

import threading,timedef run(n): time.sleep(1) print('task ',n)t1=threading.Thread(target=run,args=('t1',))t2 = threading.Thread(target=run,args=('t2',))start_time=time.time()#開始時間t1.start()t2.start()##因為是獨立線程,如果想要主線程等待其他線程運行完畢,需要使用joint1.join()t2.join()spend_time=time.time()-start_timeprint(spend_time)##1.0多,說明是并行的結果

附加說明--join是阻塞等待:

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#調用父類的__init__() self.name=name def run(self):#重寫方法,按自己的要求去寫 time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t2=MyTread('t2')start_time=time.time()t1.start()t2.start()t1.join()t2.join()time.sleep(1)###主線程等待其余線程結束print(time.time()-start_time)#結果是2.0多,證明是join是相當于阻塞了主線程的執行,只有當線程結束后才會向下執行

2.繼承threading的Thread類:

繼承threading的Thread類的類要主要做兩件事:

1.如果不做自定義變量的初始化,那么可以直接使用繼承的父類的__init__(),如果需要做自定義變量的初始化,則需要先調用父類的__init__()【否則需要自己填寫線程初始化相關的參數】

2.重寫run,雖然繼承了父類的run,但實際上如果不重寫,那么我們繼承threading的Thread類又有什么意義呢?為什么不直接調用threading的Thread類

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#調用父類的__init__() self.name=name def run(self):#重寫方法,按自己的要求去寫 time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t2=MyTread('t2')start_time=time.time()t1.start()t2.start()###主線程等待其余線程結束t1.join()t2.join()print(time.time()-start_time)#結果是1.0多,證明是并行的 子線程: 由一個線程啟動的線程可以成為它的子線程,A啟動B,B是A的子線程,A是B的父線程 線程的幾個常用函數: threading.current_thread():

返回當前正在運行的線程對象

Python多線程Threading、子線程與守護線程實例詳解threading.active_count():

返回當前進程中的存活的線程對象數

Python多線程Threading、子線程與守護線程實例詳解

線程對象.isAlive()方法判斷線程是否存活

Python多線程Threading、子線程與守護線程實例詳解

getName(): 返回線程名。 setName(): 設置線程名。

Python多線程Threading、子線程與守護線程實例詳解

get_ident():獲取當前線程ID。

守護線程: 守護線程是起到輔助功能的,就好像魔法師放禁咒總要騎士保護一樣【魔法師只需要關系自己的任務,保護他的任務交給守護者】 而守護線程與主線程的關系呢,就好像備胎跟女神,去買東西的話,備胎要一直在外面等女神【守護線程運行結束就狗帶,但不影響主進程結束,由主線程決定運行時間】,女神不需要等待備胎【主線程結束,守護線程也要結束,不管自身任務是否完成】 與join的區別:join是阻塞等待,守護線程是并行的等待 設置守護線程:線程對象.setDaemon(True)【注意!!!!!設置守護線程必須要在start()前面,不然會報錯】

下面的代碼顯示了主線程并不會等待其守護線程結束:

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print('守護線程已經啟動',self.name) time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t1.setDaemon(True)t2=MyTread('t2')t2.setDaemon(True)start_time=time.time()#開始時間t1.start()t2.start()spend_time=time.time()-start_timeprint(spend_time)##0.0多,而且三個線程都執行完畢了,說明這個是并行的等待

Python多線程Threading、子線程與守護線程實例詳解

讓主線程sleep一下,顯示一下如果主線程要等待守護線程,那么是并行的等待:

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print('守護線程已經啟動',self.name) time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t1.setDaemon(True)t2=MyTread('t2')t2.setDaemon(True)start_time=time.time()#開始時間t1.start()t2.start()time.sleep(2)spend_time=time.time()-start_timeprint(spend_time)##2.0多,而且三個線程都執行完畢了,說明這個是并行的等待

Python多線程Threading、子線程與守護線程實例詳解

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》、《Python+MySQL數據庫程序設計入門教程》及《Python常見數據庫操作技巧匯總》

希望本文所述對大家Python程序設計有所幫助。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 博客-悦享汽车品质生活 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 科客,主见不成见| 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 纳米涂料品牌 防雾抗污纳米陶瓷涂料厂家_虹瓷科技 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 超声波气象站_防爆气象站_空气质量监测站_负氧离子检测仪-风途物联网 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 电缆接头-防爆电缆接头-格兰头-金属电缆接头-防爆填料函 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 | 不锈钢列管式冷凝器,换热器厂家-无锡飞尔诺环境工程有限公司 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 翅片管换热器「型号全」_厂家-淄博鑫科环保| 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 山东石英砂过滤器,除氟过滤器「价格低」-淄博胜达水处理 | Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 小型数控车床-数控车床厂家-双头数控车床 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 |