技能要求複習

專業技能:

  • 熟練使用python
  • 熟悉Linux工作環境、熟練使用Shell及常用命令
  • 熟悉Django框架,參與過項目研發
  • 熟悉TCP/IP、UDP、HTTP、Socket
  • 熟悉深/淺拷貝、線程/進程/協程的區別
  • 熟練使用re、xpath、pyquery、BeautifulSoup、MySQL、Fiddler
  • 熟悉SQLite、Redis、MongoDB
  • 熟悉HTML、CSS、JavaScript
  • 熟悉Git開發流程
  • 有過C#、C、ARM彙編的開發經驗

熟練使用python

Python小知識總結
6類數據結構:

  • 不可變類型:字符串、數、元組tuple
  • 可變類型:列表、集合、字典
  • 字典的鍵不能是可變類型

單、雙、三引號的區別:

  • 單、雙引號無區號能相互包含
  • 三引號可跨行、保留換行符,可作註釋

global 修改全局變量

爬蟲流程、設計到的庫:

  1. 通過URL獲取網站的返回信息:requests
  2. 定位數據:re、xpath、pyquery、BeautifulSoup
  3. 存儲數據:pymysql, pymongo

熟練使用re、xpath、pyquery、BeautifulSoup、MySQL、Fiddler

pass

熟悉Linux工作環境、熟練使用Shell及常用命令

Linux三劍客的基本使用

老大awk,最擅長取列,老二sed,最擅長取行,老三grep最擅長過濾

熟悉Django框架,參與過項目研發

基於MVC的設計MTV,MTV是Model、Template、View三個單詞的簡寫,分別代表模型、模版、視圖。

熟悉HTML、CSS、JavaScript

熟悉TCP/IP、UDP、HTTP、Socket

socket,tcp,http三者之間的區別和原理

  • TCP三次握手、四次揮手
服務器客戶端建立通道、處於listen狀態主動發起連接請求回覆請求確認請求服務器客戶端
客戶端服務器主動發起斷開請求回覆請求發送完最後一字節數據後,發起主動斷開請求確認請求客戶端服務器
  • 請求報文包含三部分:

    • 請求行:包含請求方法、URI、HTTP版本信息
    • 請求首部字段
    • 請求內容實體
  • 響應報文包含三部分:

    • 狀態行:包含HTTP版本、狀態碼、狀態碼的原因短語
    • 響應首部字段
    • 響應內容實體

熟悉深/淺拷貝

python直接賦值、淺拷貝與深拷貝的區別解析

'''
1. 直接賦值,默認淺拷貝傳遞對象的引用而已,原始列表改變,被賦值的b也會做相同的改變
2. copy淺拷貝,沒有拷貝子對象,所以原始數據改變,子對象會改變
3. 深拷貝,包含對象裏面的自對象的拷貝,所以原始對象的改變不會造成深拷貝里任何子元素的改變
'''
import copy
raw = [1,2,3,["a","b"]]

rawBak = raw
rawCopy = copy.copy(raw)
rawDeepCopy = copy.deepcopy(raw)

raw.append(5)
raw[3].append("c")

print("raw:\t\t", raw)
print("rawBak:\t\t", rawBak)
print("rawCopy:\t", rawCopy)
print("rawDeepCopy:", rawDeepCopy)

''' resultPrint
raw:		 [1, 2, 3, ['a', 'b', 'c'], 5]
rawBak:		 [1, 2, 3, ['a', 'b', 'c'], 5]
rawCopy:	 [1, 2, 3, ['a', 'b', 'c']]
rawDeepCopy: [1, 2, 3, ['a', 'b']]
'''

熟悉線程/進程/協程的區別

進程,線程,協程與並行,併發

進程
進程的出現是爲了更好的利用CPU資源使到併發成爲可能。 假設有兩個任務A和B,當A遇到IO操作,CPU默默的等待任務A讀取完操作再去執行任務B,這樣無疑是對CPU資源的極大的浪費。聰明的老大們就在想若在任務A讀取數據時,讓任務B執行,當任務A讀取完數據後,再切換到任務A執行。注意關鍵字切換,自然是切換,那麼這就涉及到了狀態的保存,狀態的恢復,加上任務A與任務B所需要的系統資源(內存,硬盤,鍵盤等等)是不一樣的。自然而然的就需要有一個東西去記錄任務A和任務B分別需要什麼資源,怎樣去識別任務A和任務B等等。登登登,進程就被髮明出來了。通過進程來分配系統資源,標識任務。如何分配CPU去執行進程稱之爲調度,進程狀態的記錄,恢復,切換稱之爲上下文切換。進程是系統資源分配的最小單位,進程佔用的資源有:地址空間,全局變量,文件描述符,各種硬件等等資源。

線程
線程的出現是爲了降低上下文切換的消耗,提高系統的併發性,並突破一個進程只能幹一樣事的缺陷,使到進程內併發成爲可能。假設,一個文本程序,需要接受鍵盤輸入,將內容顯示在屏幕上,還需要保存信息到硬盤中。若只有一個進程,勢必造成同一時間只能幹一樣事的尷尬(當保存時,就不能通過鍵盤輸入內容)。若有多個進程,每個進程負責一個任務,進程A負責接收鍵盤輸入的任務,進程B負責將內容顯示在屏幕上的任務,進程C負責保存內容到硬盤中的任務。這裏進程A,B,C間的協作涉及到了進程通信問題,而且有共同都需要擁有的東西-------文本內容,不停的切換造成性能上的損失。若有一種機制,可以使任務A,B,C共享資源,這樣上下文切換所需要保存和恢復的內容就少了,同時又可以減少通信所帶來的性能損耗,那就好了。是的,這種機制就是線程。線程共享進程的大部分資源,並參與CPU的調度, 當然線程自己也是擁有自己的資源的,例如,棧,寄存器等等。 此時,進程同時也是線程的容器。線程也是有着自己的缺陷的,例如健壯性差,若一個線程掛掉了,整一個進程也掛掉了,這意味着其它線程也掛掉了,進程卻沒有這個問題,一個進程掛掉,另外的進程還是活着。

協程
協程通過在線程中實現調度,避免了陷入內核級別的上下文切換造成的性能損失,進而突破了線程在IO上的性能瓶頸。 當涉及到大規模的併發連接時,例如10K連接。以線程作爲處理單元,系統調度的開銷還是過大。當連接數很多 —> 需要大量的線程來幹活 —> 可能大部分的線程處於ready狀態 —> 系統會不斷地進行上下文切換。既然性能瓶頸在上下文切換,那解決思路也就有了,在線程中自己實現調度,不陷入內核級別的上下文切換。說明一下,在歷史上協程比線程要出現得早,在1963年首次提出, 但沒有流行開來。爲什麼沒有流行,沒有找到信服的資料,先挖個坑,以後那天瞭解後,再補上。

小結
進程,線程,協程不斷突破,更高效的處理阻塞,不斷地提高CPU的利用率。但是並不是說,線程就一定比進程快,而協程就一定不線程要快。具體還是要看應用場景。可以簡單粗暴的把應用分爲IO密集型應用以及CPU密集型應用。

多核CPU,CPU密集型應用
此時多線程的效率是最高的,多線程可以使到全部CPU核心滿載,又避免了協程間切換造成性能損失。當CPU密集型任務時,CPU一直在利用着,切換反而會造成性能損失,即便協程上下文切換消耗最小,但也還是有消耗的。

多核CPU,IO密集型應用
此時採用多線程多協程效率最高,多線程可以使到全部CPU核心滿載,而一個線程多協程,則更好的提高了CPU的利用率。

單核CPU,CPU密集型應用
單進程效率是最高,此時單個進程已經使到CPU滿載了。

單核CPU,IO密集型應用
多協程,效率最高。例如,看了上面應該也是知道的了

併發與並行
並行
並行就是指同一時刻有兩個或兩個以上的“工作單位”在同時執行,從硬件的角度上來看就是同一時刻有兩條或兩條以上的指令處於執行階段。所以,多核是並行的前提,單線程永遠無法達到並行狀態。可以利用多線程和度進程到達並行狀態。另外的,Python的多線程由於GIL的存在,對於Python來說無法通過多線程到達並行狀態。

併發
對於併發的理解,要從兩方面去理解,1.併發設計 2.併發執行。先說併發設計,當說一個程序是併發的,更多的是指這個程序採取了併發設計。

併發設計的標準:使多個操作可以在重疊的時間段內進行 ,這裏的重點在於重疊的時間內, 重疊時間可以理解爲一段時間內。例如:在時間1s秒內, 具有IO操作的task1和task2都完成,這就可以說是併發執行。所以呢,單線程也是可以做到併發運行的。當然啦,並行肯定是併發的。一個程序能否併發執行,取決於設計,也取決於部署方式。例如, 當給程序開一個線程(協程是不開的),它不可能是併發的,因爲在重疊時間內根本就沒有兩個task在運行。當一個程序被設計成完成一個任務再去完成下一個任務的時候,即便部署是多線程多協程的也是無法達到併發運行的。

並行與併發的關係: 併發的設計使到併發執行成爲可能,而並行是併發執行的其中一種模式。

一個老師同一時間段輔導3個學生,併發。單核。
三個老師同時輔導3個學生,並行。多核。



熟悉SQLite、Redis、MongoDB

SQLite:一個輕量級、跨平臺的關係型數據庫,在嵌入式平臺使用過
Redis:速度快

  • String——字符串
  • Hash——字典
  • List——列表
  • Set——集合
  • Sorted Set——有序集合

MongoDB:

  • 基於內存;
  • 數據結構簡單,對數據操作也簡單;
  • 操作數據是單線程,避免了不必要的上下文切換,沒有鎖機制,不用加鎖解鎖;
  • 多路複用:多個網絡連接,複用同一個線程,單線程處理多個請求,儘量減少網絡IO的時間消耗。

熟悉Git開發流程

有過C#、C、ARM彙編的開發經驗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章