版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
口令:RAPID708第12章
多線程和多進(jìn)程學(xué)習(xí)目標(biāo)了解多線程和多進(jìn)程的含義和區(qū)別。掌握多進(jìn)程的相關(guān)操作。掌握多線程的相關(guān)操作。多線程程序只能從上到下,逐行執(zhí)行代碼,多線程讓程序擁有分身效果,能同時(shí)處理多件事情。多線程是加速程序運(yùn)算的有效方法,在Python中多線程操作使用“threading”模塊。創(chuàng)建線程importthreadingdefthread_job():print('當(dāng)前線程個(gè)數(shù):%s'%threading.active_count())print('當(dāng)前線程信息:%s'%threading.current_thread())print('所有線程信息:%s'%threading.enumerate())definit():thread=threading.Thread(target=thread_job)#定義線程thread.start() #啟動(dòng)線程if__name__=='__main__':init()多線程多線程操作時(shí)可能會(huì)遇到線程搶占的情況。importthreadingimporttimedefthread_job():print("T1start\n")time.sleep(0.1) #延時(shí)0.1sprint("T1finish\n")added_thread=threading.Thread(target=thread_job,name='T1')added_thread.start()print("alldone\n")多線程線程等待importthreadingimporttimedefthread1_job():print('T1start\n')time.sleep(1)print('T1finish\n')defthread2_job():print('T2start\n')print('T2finish\n')defmain():thread1=threading.Thread(target=thread1_job,name='T1')thread2=threading.Thread(target=thread2_job,name='T2')thread1.start()thread2.start()thread1.join()#等待線程T1執(zhí)行完成后,才會(huì)繼續(xù)運(yùn)行
print('alldone\n')if__name__=='__main__':main()多線程線程存儲(chǔ)importthreadingimporttimefromqueueimportQueuedefjob(l,q):foriinrange(len(l)):l[i]=l[i]**2q.put(l) #數(shù)據(jù)存儲(chǔ)definit():q=Queue()threads=[]data=[[1,2,3],[4,5,6],[7,7,7],[8,8,8]]foriinrange(4):#創(chuàng)建4個(gè)線程t=threading.Thread(target=job,args=(data[i],q))t.start()threads.append(t)forthreadinthreads:thread.join()results=[]for_inrange(4):results.append(q.get()) #獲取數(shù)據(jù)print(results)if__name__=='__main__':init()多線程使用“join()”方法雖然在一定程度上加強(qiáng)了線程管理,但是線程運(yùn)行效果依舊很混亂。importthreadingdefjob1():globalAforiinrange(10):#全局變量A循環(huán)10次,每次循環(huán)加1A+=1print('job1',A)defjob2():globalAforiinrange(10):#全局變量A循環(huán)10次,每次循環(huán)加10A+=10print('job2',A)if__name__=='__main__':lock=threading.Lock()A=0t1=threading.Thread(target=job1)t2=threading.Thread(target=job2)t1.start()t2.start()t1.join()t2.join()多線程線程同步importthreadingdefjob1():globalA,locklock.acquire() #內(nèi)存上鎖foriinrange(10):A+=1print('job1',A)lock.release() #內(nèi)存鎖打開(kāi)defjob2():globalA,locklock.acquire()foriinrange(10):A+=10print('job2',A)lock.release()if__name__=='__main__':lock=threading.Lock() #定義Lock()對(duì)象A=0t1=threading.Thread(target=job1)t2=threading.Thread(target=job2)t1.start()t2.start()t1.join()t2.join()多進(jìn)程多線程是有劣勢(shì)的,“GIL”(全局解釋器鎖)讓它沒(méi)能更有效率的處理一些分?jǐn)偟娜蝿?wù),而現(xiàn)在的電腦大部分配備了多核處理器,多進(jìn)程可以讓電腦更有效率的分配任務(wù)給每一個(gè)處理器,這種做法有效解決多線程的弊端。importmultiprocessingasmpdefjob():print('job')if__name__=='__main__':p1=mp.Process(target=job)p1.start()p1.join()多進(jìn)程importmultiprocessingasmpdefjob(q):res=0foriinrange(1000):res+=i+i**2+i**3q.put(res)#將進(jìn)程運(yùn)行結(jié)果存放到隊(duì)列中if__name__=='__main__':q=mp.Queue()p1=mp.Process(target=job,args=(q,))#進(jìn)程1p2=mp.Process(target=job,args=(q,))#進(jìn)程2p1.start()p2.start()p1.join()p2.join()res1=q.get() #從隊(duì)列中取出數(shù)據(jù)res2=q.get()print(res1+res2)進(jìn)程存儲(chǔ)多進(jìn)程進(jìn)程池importmultiprocessingasmpdefjob(x):returnx*xdefinit():pool=mp.Pool()res=pool.map(job,range(10))print(res)if__name__=='__main__':init()設(shè)置進(jìn)程池CPU核數(shù)definit():pool=mp.Pool(processes=3)#自定義CPU核數(shù)量為3res=pool.map(job,range(10))print(res)進(jìn)程池傳單個(gè)參數(shù)definit():pool=mp.Pool()res=pool.map(job,range(10))print(res)res=pool.apply_async(job,(2,))print(res.get())#獲得結(jié)果進(jìn)程池傳多個(gè)參數(shù)definit():pool=mp.Pool()res=pool.map(job,range(10))print(res)res=pool.apply_async(job,(2,))print(res.get())#獲得結(jié)果
multi_res=[pool.apply_async(job,(i,))foriinrange(10)]#迭代器輸入
print([res.get()forresinmulti_res])#迭代輸出多進(jìn)程進(jìn)程同步importmultiprocessingasmpimporttimedefjob(num1,num2):for_inrange(5):time.sleep(0.1)#延時(shí)0.1Snum1.value+=num2#v.value獲取共享變量值print(num1.value,end="")definit():num=mp.Value('i',0)#定義共享變量p1=mp.Process(target=job,args=(num,1)) #累加值1p2=mp.Process(target=job,args=(num,3)) #累加值3p1.start()p2.start()p1.join()p2.join()if__name__=='__main__':init()多進(jìn)程進(jìn)程鎖importmultiprocessingasmpimporttimedefjob(num1,num2,l):l.acquire()#內(nèi)存鎖住for_inrange(5):time.sleep(0.1)num1.value+=num2#獲取共享內(nèi)存print(num1.value)l.release()#內(nèi)存釋放definit():l=mp.Lock(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 烏雞白鳳丸國(guó)際專利申請(qǐng)策略-洞察分析
- 通信網(wǎng)絡(luò)切片技術(shù)研究-洞察分析
- 跳蚤市場(chǎng)運(yùn)營(yíng)風(fēng)險(xiǎn)管理-洞察分析
- 2025年浙教新版六年級(jí)英語(yǔ)上冊(cè)階段測(cè)試試卷
- 2025年湘教版八年級(jí)生物上冊(cè)階段測(cè)試試卷
- 電子廠芯片保管員招聘協(xié)議
- 餐飲住宿房產(chǎn)合同
- 科技期刊數(shù)字化傳播與管理
- 草原野生動(dòng)植物觀察租賃合同
- 會(huì)計(jì)師事務(wù)所幕墻施工協(xié)議
- IDC云數(shù)據(jù)中心機(jī)房運(yùn)維服務(wù)解決方案
- 產(chǎn)品經(jīng)理必備BP模板(中文版)
- 維西縣城市生活垃圾熱解處理工程環(huán)評(píng)報(bào)告
- GB/T 9128.2-2023鋼制管法蘭用金屬環(huán)墊第2部分:Class系列
- 網(wǎng)絡(luò)經(jīng)濟(jì)學(xué)PPT完整全套教學(xué)課件
- 2023年主治醫(yī)師(中級(jí))-臨床醫(yī)學(xué)檢驗(yàn)學(xué)(中級(jí))代碼:352考試參考題庫(kù)附帶答案
- 機(jī)械原理課程設(shè)計(jì)鎖梁自動(dòng)成型機(jī)床切削機(jī)構(gòu)
- 順產(chǎn)臨床路徑
- 人教版培智一年級(jí)上生活適應(yīng)教案
- 推動(dòng)架機(jī)械加工工序卡片
- RoHS檢測(cè)報(bào)告完整版
評(píng)論
0/150
提交評(píng)論