GIL全局解釋器鎖
-
描述Python GIL的概念, 以及它對python多線程的影響?編寫?個 多線程抓取??的程序,并闡明多線程抓取程序是否可?單線程性 能有提升轨奄,并解釋原因。
Python語?和GIL沒有半?錢關(guān)系拒炎。僅僅是由于歷史原因在 Cpython虛擬機(jī)(解釋器)挪拟,難以移除GIL。
GIL:全局解釋器鎖击你。每個線程在執(zhí)?的過程都需要先獲取 GIL玉组,保證同?時刻只有?個線程可以執(zhí)?代碼谎柄。
線程釋放GIL鎖的情況: 在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執(zhí)?完畢后,必須重新獲取GIL Python 3.x使?計(jì)時器(執(zhí)?時間達(dá)到閾值后,當(dāng)前線程釋放 GIL)或Python 2.x惯雳,tickets計(jì)數(shù)達(dá)到100
Python使?多進(jìn)程是可以利?多核的CPU資源的朝巫。
多線程爬取?單線程性能有提升,因?yàn)橛龅絀O阻塞會?動釋放 GIL鎖
-
解決方法
換解釋器
在一些部位換語言
淺拷貝石景、深拷貝
1.淺拷貝
- 淺拷貝是對于一個對象的頂層拷貝(拷貝了引用劈猿,并沒有拷貝內(nèi)容)
2.深拷貝
- 深拷貝是對于一個對象所有層次的拷貝(遞歸)
3.拷貝的其他方式
切片表達(dá)式可以賦值一個序列(淺拷貝)
字典的copy方法可以拷貝一個字典(淺拷貝)
4.注意點(diǎn)
- 拷貝對不可變類型和可變類型的copy不同
1.copy.copy對于可變類型,會進(jìn)行淺拷貝
2.copy.copy對于不可變類型潮孽,不會拷貝揪荣,僅僅是指向
私有化
xx:公有變量
_x:但前置下劃線,私有化屬性或方法往史,from somemodule import *禁止導(dǎo)入仗颈,類對象和子類可以訪問
__xx:雙前置下劃線,避免與子類中的屬性命名沖突怠堪,無法在外部直接訪問(名字重整所以訪問不到)
xx:雙前后下劃線揽乱,用戶名字空間的魔法對象或?qū)傩悦肌@纾?strong>init,__不要自己發(fā)明這樣的名字
xx_:單后置下劃線粟矿,用于避免與Python關(guān)鍵詞的沖突
import導(dǎo)入模塊
- import搜素路徑
improt sys
print(sys.path)
- 從上面列出的目錄里依次查找導(dǎo)入的模塊文件
- "表示當(dāng)前路徑
- 列表中的路徑的先后順序代表了python解釋器在搜索模塊時的先后順序
- 重新導(dǎo)入模塊
- 模塊被導(dǎo)入后, import module 不能重新導(dǎo)入模塊损拢,重新導(dǎo)入需要reload
from imp import reload
reload(模塊名)
- 多模塊開發(fā)時注意點(diǎn)
- 要修改某個引用模塊內(nèi)的屬性值陌粹,必須使用 import
封裝、繼承福压、多態(tài)
- 在使用面向過程編程時掏秩,當(dāng)需要對數(shù)據(jù)處理時,需要考慮用哪個模板中哪個函數(shù)來進(jìn)行操作荆姆,但是當(dāng)用面向?qū)ο缶幊虝r蒙幻,因?yàn)橐呀?jīng)將數(shù)據(jù)存儲到了這個獨(dú)立的空間中,這個獨(dú)立的空間(即對象)中通過一個特殊的變量(class)能夠獲取到類(模板)胆筒,而且這個類中的方法是有一定數(shù)量的邮破,與此類無關(guān)的將不會出現(xiàn)在本類中,因此需要對數(shù)據(jù)處理時仆救,可以很快速的定位到需要的方法是誰 這樣更方便
- 全局變量是只能有1份的抒和,多很多個函數(shù)需要多個備份時,往往需要利用其它的變量來進(jìn)行儲存彤蔽;而通過封裝 會將用來存儲數(shù)據(jù)的這個變量 變?yōu)榱藢ο笾械囊粋€“全局”變量摧莽,只要對象不一樣那么這個變量就可以再有1份,所以這樣更方便
- 代碼劃分更清晰
多繼承以及MRO順序
1.單獨(dú)調(diào)用父類的方法
2.多繼承中super調(diào)用有所父類的被重寫的方法
* 如果使用super().xxxx()那么會拿著當(dāng)前類的名字到類名.mro獲取到的元組中去找顿痪,只要找到镊辕,那么就調(diào)用它的下一個方法
* 如果使用super(類名油够,self).xxxx()那么會拿著類的名字到類名.mro獲取到的元組中去找,只要找到丑蛤,那么就調(diào)用它的下一個方法
3.單繼承中super
總結(jié)
1.super().init相對于類名.init,在單繼承上用法基本無差
2.但在多繼承上有區(qū)別叠聋, super方法能保證每個父類的方法只會執(zhí)行一次,而使用類名的方法會導(dǎo)致方法被執(zhí)行多次受裹,具體看前面的輸出結(jié)果
3.多繼承時碌补,使用super方法,對父類的傳參數(shù)棉饶,應(yīng)該是由于python中super的算法導(dǎo)致的原因厦章,必須把參數(shù)全部傳遞,否則會報錯
4.單繼承時照藻,使用suoer方法袜啃, 則不能全部傳遞,只能傳父類方法所需的參數(shù)幸缕,否則會報錯
5.多繼承時群发,相對與使用類名.init方法,要把每個父類全部寫一遍发乔,而使用super方法熟妓,只需寫一句話便執(zhí)行全部父類的方法, 這也是為何多繼承需要全部傳參的一個原因
靜態(tài)方法和類方法
1.類屬性栏尚、實(shí)例屬性
- 實(shí)例屬性屬于對象:實(shí)例屬性在每個對象中都要保存一份
- 類屬性屬于類:類屬性內(nèi)存中只保存一份
- 應(yīng)用場景:通過類創(chuàng)建實(shí)例對象時起愈,如果每個對象需要具有相同名字的屬性,那么就使用類屬性译仗,用一份即可
2.實(shí)例方法抬虽,靜態(tài)方法和類 方法;三種方法在內(nèi)存中都?xì)w屬于類纵菌,區(qū)別在于調(diào)用方式不同
實(shí)例方法:由對象調(diào)用阐污;至少一個self參數(shù);執(zhí)行實(shí)例方法時咱圆,自動將調(diào)用該方法的對象賦值給self
類方法:由類調(diào)用笛辟;至少一個cls參數(shù);執(zhí)行類方法時闷堡,自動將調(diào)用該方法的類賦值給cls
靜態(tài)方法:由類調(diào)用隘膘;無默認(rèn)參數(shù)
相同點(diǎn):對于所有的方法而言,均屬于類杠览,所以在內(nèi)存中也只保存一份
不同點(diǎn):方法調(diào)用者不同弯菊、調(diào)用方法時自動傳入?yún)?shù)不同
property屬性
- 一種用起來像是使用的實(shí)例屬性一樣的特殊屬性,可以對應(yīng)于某個方法
- 定義時,在實(shí)例方法的基礎(chǔ)上添加@property裝飾器管钳;并且僅有一個self參數(shù)
- 調(diào)用時钦铁,無需括號
方法:foo_obj.func()
property屬性:foo_obj.prop
- Python的property屬性的功能是 :property屬性內(nèi)部進(jìn)行一系列的邏輯計(jì)算,最終將計(jì)算結(jié)果返回
property屬性的兩種方式
- 裝飾器即:在方法上應(yīng)用裝飾器
- 類屬性即:在類中定義值為property對象的類屬性
裝飾器方式
經(jīng)典類中的屬性只有一種訪問方式才漆,其對應(yīng)被@property修飾的方法
新式類中的屬性有三種訪問方式牛曹,并分別對應(yīng)了三個被@property、@方法名.setter醇滥、@方法名.deleter修飾的方法黎比,可以根據(jù)幾個屬性的訪問特點(diǎn)分別將三個方法定義為對同一個屬性:獲取、修改鸳玩、刪除
當(dāng)使用類屬性的方式創(chuàng)建property屬性時阅虫,經(jīng)典類和新式類無區(qū)別
property方法的四個參數(shù)
- 第一個參數(shù)是方法名,調(diào)用對象.屬性時自動觸發(fā)執(zhí)行方法
- 第二個參數(shù)是方法名不跟,調(diào)用對象.屬性 = xxx時自動觸發(fā)執(zhí)行方法
- 第三個參數(shù)是方法名颓帝,調(diào)用del對象.屬性時自動觸發(fā)執(zhí)行方法
- 第四個參數(shù)是字符串,調(diào)用對象.屬性.doc,此參數(shù)是該屬性的描述信息
總結(jié)
- 定義property屬性共有兩種方式,分別是【裝飾器】和【類屬性】窝革,而【裝飾器】方式針對經(jīng)典類和新式類又有所不同
- 通過使用property屬性购城,能夠簡化調(diào)用者在獲取數(shù)據(jù)的流程
proeprty屬性應(yīng)用
- 重新實(shí)現(xiàn)一個屬性的設(shè)置和讀取方法,可做邊界判定
魔法屬性
1.doc:表示類的描述信息
2.module和class
- module表示當(dāng)前操作的對象在那個模塊
- class表示當(dāng)前操作的對象類是什么(當(dāng)獲取實(shí)例屬性的時候虐译,如果實(shí)例對象中沒有這個屬性瘪板,那么就會按照class指定的類對象中找到這個類屬性)
3.init:初始化方法,通過類創(chuàng)建對象時菱蔬,自動觸發(fā)執(zhí)行
4.del:當(dāng)對象在內(nèi)存中被釋放篷帅,自動觸發(fā)執(zhí)行(對象計(jì)數(shù)為0或程序執(zhí)行結(jié)束時觸發(fā))
5.call:對象后面加括號史侣,觸發(fā)執(zhí)行
6.dict:類會對象中的所有屬性
7.str:如果一個類中定義了str,那么在打印對象時拴泌,默認(rèn)輸出該方法的返回值(只要是獲取這個對象的描述的情況,都會調(diào)用)
8.getitem惊橱、setitem蚪腐、delitem
- 用于索引操作,如字典税朴,以上分別表示獲取回季、設(shè)置、刪除
9.getslice正林、setslice泡一、delslice
- 該三個方法用于分片操作,如:列表
面向?qū)ο笤O(shè)計(jì)
- 繼承-是基于Python中的屬性查找(如X.name)
- 多態(tài)-在X.medthod方法中觅廓,method的意義取決于X的類型
- 封裝-方法和運(yùn)算符實(shí)現(xiàn)行為鼻忠,數(shù)據(jù)隱藏默認(rèn)是一種慣例
with與"上下文管理器"
- 系統(tǒng)資源如文件、數(shù)據(jù)庫連接杈绸、socket而言帖蔓。應(yīng)用程序打開這些資源并執(zhí)行完業(yè)務(wù)邏輯之后矮瘟,必須做的一件事就是要關(guān)閉(斷開)該資源
- 上下文管理器:任何實(shí)現(xiàn)了enter()和exit()方法的對象都可稱之為上下文管理器
- with語法用于簡化資源操作的后續(xù)清除操作,是try/finally的替代方法塑娇,實(shí)現(xiàn)原理建立在上下文管理器之上