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