教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Python就業(yè)班筆記整理(三)

更新時間:2018年07月27日10時02分 來源:傳智播客 瀏覽次數(shù):

進(jìn)程、線程的區(qū)別與優(yōu)缺點(diǎn)

1. 定義的不同:
進(jìn)程是系統(tǒng)進(jìn)行資源分配的最小單位.
線程是進(jìn)程的一個實(shí)體,是CPU進(jìn)行調(diào)度的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
2. 區(qū)別:
一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程.線程的劃分尺度小于進(jìn)程(資源比進(jìn)程少),使得多線程程序的并發(fā)性高。進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個線程共享內(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)建一個進(jìn)程的實(shí)力對象
P = Multiprocessing.Process(target=func_name[,args=(元組), kwargs={字典}])
# 創(chuàng)建并啟動進(jìn)程
p.start()
p.join(5)
通過Queue實(shí)現(xiàn)進(jìn)程間通信

# 創(chuàng)建一個隊(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()的方式,否則會報(bào)錯。
進(jìn)程池Pool

當(dāng)需要創(chuàng)建的子進(jìn)程數(shù)量不多時,可以直接利用multiprocessing中的Process動態(tài)成生多個進(jìn)程,但如果是上百甚至上千個目標(biāo),手動的去創(chuàng)建進(jìn)程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法。
初始化Pool時,可以指定一個最大進(jìn)程數(shù),當(dāng)有新的請求提交到Pool中時,如果池還沒有滿,那么就會創(chuàng)建一個新的進(jìn)程用來執(zhí)行該請求;但如果池中的進(jìn)程數(shù)已經(jīng)達(dá)到指定的最大值,那么該請求就會等待,直到池中有進(jìn)程結(jié)束,才會用之前的進(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非阻塞,不會等待子進(jìn)程結(jié)束;apply阻塞,會等待子進(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é)程,利用線程在等待某個資源的期間執(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ò)請求,網(wǎng)絡(luò)可能會有堵塞,此時用協(xié)程比較合適。

什么是GIL?

GIL并不是Python的特性,Python完全可以不依賴于GIL。GIL全稱Global Interpreter Lock。它是在實(shí)現(xiàn)Python解析器(CPython)時所引入的一個概念。GIL無疑就是一把全局排他鎖。
Python GIL其實(shí)是功能和性能之間權(quán)衡后的產(chǎn)物,它尤其存在的合理性,也有較難改變的客觀因素。因?yàn)镚IL的存在,只有IO Bound場景下得多線程會得到較好的性能,如果對并行計(jì)算性能較高的程序可以考慮把核心部分也成C模塊,或者索性用其他語言實(shí)現(xiàn)
GIL在較長一段時間內(nèi)將會繼續(xù)存在,但是會不斷對其進(jìn)行改進(jìn)。
作者:傳智播客python培訓(xùn)學(xué)院
首發(fā):http://python.itcast.cn/
0 分享到:
和我們在線交談!