進(jìn)程、線程的區(qū)別與優(yōu)缺點(diǎn)
1. 定義的不同:
進(jìn)程是系統(tǒng)進(jìn)行資源分配的最小單位.
線程是進(jìn)程的一個(gè)實(shí)體,是CPU進(jìn)行調(diào)度的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
2. 區(qū)別:
一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.線程的劃分尺度小于進(jìn)程(資源比進(jìn)程少),使得多線程程序的并發(fā)性高。進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。線程不能夠獨(dú)立執(zhí)行,必須依存在進(jìn)程中
3. 優(yōu)缺點(diǎn):
線程執(zhí)行開銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。
進(jìn)程的創(chuàng)建步驟
# 導(dǎo)入進(jìn)程模塊
Import multiprocessing
# 創(chuàng)建一個(gè)進(jìn)程的實(shí)力對(duì)象
P = Multiprocessing.Process(target=func_name[,args=(元組), kwargs={字典}])
# 創(chuàng)建并啟動(dòng)進(jìn)程
p.start()
p.join(5)
通過Queue實(shí)現(xiàn)進(jìn)程間通信
# 創(chuàng)建一個(gè)隊(duì)列
Q = multiprocessing.Queue() # 3代表隊(duì)列中最多可以接收三條消息
# 向隊(duì)列中添加數(shù)據(jù)
q.put(data)
# 從隊(duì)列中取數(shù)據(jù)
q.get()
# 判斷隊(duì)列中是否為空
q.empty()
# 判斷隊(duì)列中是否已滿
q.full()
注意:如果是通過進(jìn)程池創(chuàng)建的進(jìn)程,那么隊(duì)列的使用要用
multiprocessing.Manager().Queue()的方式,否則會(huì)報(bào)錯(cuò)。
進(jìn)程池Pool
當(dāng)需要?jiǎng)?chuàng)建的子進(jìn)程數(shù)量不多時(shí),可以直接利用multiprocessing中的Process動(dòng)態(tài)成生多個(gè)進(jìn)程,但如果是上百甚至上千個(gè)目標(biāo),手動(dòng)的去創(chuàng)建進(jìn)程的工作量巨大,此時(shí)就可以用到multiprocessing模塊提供的Pool方法。
初始化Pool時(shí),可以指定一個(gè)最大進(jìn)程數(shù),當(dāng)有新的請(qǐng)求提交到Pool中時(shí),如果池還沒有滿,那么就會(huì)創(chuàng)建一個(gè)新的進(jìn)程用來執(zhí)行該請(qǐng)求;但如果池中的進(jìn)程數(shù)已經(jīng)達(dá)到指定的最大值,那么該請(qǐng)求就會(huì)等待,直到池中有進(jìn)程結(jié)束,才會(huì)用之前的進(jìn)程來執(zhí)行新的任務(wù)
進(jìn)程池的實(shí)現(xiàn)步驟
# 導(dǎo)入進(jìn)程池模塊
From multiprocessing import Pool
# 定義進(jìn)程池,最大進(jìn)程池最大數(shù)
Po = Pool(3)
# 通過進(jìn)程池調(diào)用目標(biāo) apply_async非阻塞,不會(huì)等待子進(jìn)程結(jié)束;apply阻塞,會(huì)等待子進(jìn)程結(jié)束才結(jié)束
po.apply_async(要調(diào)用的目標(biāo),(傳遞給目標(biāo)的參數(shù)元祖,))
# 關(guān)閉進(jìn)程池
Po.close()
# 等待進(jìn)程池執(zhí)行完畢
Po.join()
什么是協(xié)程?
協(xié)程,又稱微線程,纖程。英文名Coroutine。協(xié)程,利用線程在等待某個(gè)資源的期間執(zhí)行其他函數(shù),切換資源消耗非常小,協(xié)程效率相當(dāng)快。
進(jìn)程、線程、協(xié)程的區(qū)別?
進(jìn)程、線程、協(xié)程的區(qū)別
進(jìn)程是資源分配的單位,真正執(zhí)行代碼的是線程,操作系統(tǒng)真正調(diào)度的是線程。
進(jìn)程沒有線程效率高,進(jìn)程占用資源多,線程占用資源少,比線程更少的是協(xié)程。
協(xié)程依賴于線程、線程依賴于進(jìn)程,進(jìn)程一死線程必掛,線程一掛協(xié)程必死
一般不用多進(jìn)程,可以考慮使用多線程,如果多線程里面有很多網(wǎng)絡(luò)請(qǐng)求,網(wǎng)絡(luò)可能會(huì)有堵塞,此時(shí)用協(xié)程比較合適。
什么是GIL?
GIL并不是Python的特性,Python完全可以不依賴于GIL。GIL全稱Global Interpreter Lock。它是在實(shí)現(xiàn)Python解析器(CPython)時(shí)所引入的一個(gè)概念。GIL無疑就是一把全局排他鎖。
Python GIL其實(shí)是功能和性能之間權(quán)衡后的產(chǎn)物,它尤其存在的合理性,也有較難改變的客觀因素。因?yàn)镚IL的存在,只有IO Bound場景下得多線程會(huì)得到較好的性能,如果對(duì)并行計(jì)算性能較高的程序可以考慮把核心部分也成C模塊,或者索性用其他語言實(shí)現(xiàn)
GIL在較長一段時(shí)間內(nèi)將會(huì)繼續(xù)存在,但是會(huì)不斷對(duì)其進(jìn)行改進(jìn)。
作者:傳智播客python培訓(xùn)學(xué)院
首發(fā):http://python.itcast.cn/