《Python程序設(shè)計(jì)》第12章 多線程和多進(jìn)程_第1頁(yè)
《Python程序設(shè)計(jì)》第12章 多線程和多進(jìn)程_第2頁(yè)
《Python程序設(shè)計(jì)》第12章 多線程和多進(jìn)程_第3頁(yè)
《Python程序設(shè)計(jì)》第12章 多線程和多進(jìn)程_第4頁(yè)
《Python程序設(shè)計(jì)》第12章 多線程和多進(jìn)程_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)存鎖打開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”(全局解釋器鎖)讓它沒能更有效率的處理一些分?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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論