第壹步:自我介紹
第二步:公司介紹
第三步:技術基礎
第四步:項目介紹
第五步:待遇
自我介紹,簡單直接,姓名,籍貫,大學,工作經歷
示例如下:
妳好,面試官,我叫XX,來自XX,本科畢業於XX,主修XX專業,有X年工作經驗,在上壹家公司擔任python後端開發工程師的職位。
公司名稱是XX、公司主要做外包軟件、都有軟件定制/商城定制、前端2個後端2個運維1個
主要是根據妳簡歷中填寫的技術,根據我的簡歷中所寫的,總結幾點如下:
字典的查詢流程:
不可變對象可哈希, str , fronzenset , tuple ,自己實現的類,要重載 __hash__ 方法。
dict內存花銷大,但是查詢速度快,自定義的對象或者python內部的對象都是dict包裝的。
dict的存儲順序和元素添加順序有關,添加順序可能改變已有數據的順序。
集合:是壹個可以存放任意數據類型的可變無序的映射集合。
set和dict類似,set的核心也是散列表,但是表元只包含值的引用。 由於散列表的特性,set的元素不能重復,且無序。 內部由哈希實現,查找的時間復雜度為O(1),所以性能很高,實現了魔法函數 __contains__ 可以使用in來查找。 set的去重是通過兩個函數 __hash__ 和 __eq__ 實現的。
(1)淺拷貝
定義:淺拷貝只是對另外壹個變量的內存地址的拷貝,這兩個變量指向同壹個內存地址的變量值。
淺拷貝的特點:
(2)深拷貝:
定義:壹個變量對另外壹個變量的值拷貝。
深拷貝的特點:
Python GC主要使用引用計數(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環引用問題,通過“分代回收”(generation collectio n)以空間換時間的方法提高垃圾回收效率。
GIL全稱 Global Interpreter Lock ,中文解釋為全局解釋器鎖。它並不是Python的特性,而是在實現python的主流Cpython解釋器時所引入的壹個概念,GIL本質上就是壹把互斥鎖,將並發運行變成串行,以此來控制同壹時間內***享數據只能被壹個任務所修改,從而保證數據的安全性。
GIL保護的是解釋器級別的數據,但是用戶自己的數據需要自己加鎖處理。
既然有了GIL的存在,壹個進程中同壹時刻只有壹個線程能夠被執行,無法利用cpu的多核機制,導致多線程用於I/O密集型,多進程用於計算密集型,如金融分析等。
死鎖:兩個或兩個以上的進程或者線程在執行過程中,因為爭奪資源而造成的互相等待現象,若無外力的作用,都將壹直處於阻塞狀態,這些互相等待的進程或者線程就被稱為死鎖。
解決方法,使用遞歸鎖(RLock)
這個RLock內部有壹個Lock和壹個counter變量,counter記錄著acquire的次數,從而使得資源可以被多次require。直到壹個線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發生死鎖
可以直接認為是linux,畢竟搞後端的多數是和linux打交道。
那麽如何避免粘包問題呢? 歸根結底就是壹句話, 明確兩個包之間的邊界.
UDP不存在粘包問題,是由於UDP發送的時候,沒有經過Negal算法優化,不會將多個小包合並壹次發送出去。另外,在UDP協議的接收端,采用了鏈式結構來記錄每壹個到達的UDP包,這樣接收端應用程序壹次recv只能從socket接收緩沖區中讀出壹個數據包。也就是說,發送端send了幾次,接收端必須recv幾次(無論recv時指定了多大的緩沖區)。
存儲可能包含rdbms,nosql以及緩存等,我以mysql,redis舉例**