【python】同步/異步與阻塞/非阻塞,get/post,__new__/__init__,async/await相關概念

同步/異步與阻塞/非阻塞

  1. 同步和異步關注的是消息通信機制.
  2. 同步異步指的是調用者與被調用者兩者之間的關係,而不是經常容易誤解的多個被調用者之間的關係。
  3. 同步就是當一個進程發起一個函數(任務)調用的時候,一直等到函數(任務)完成,而進程繼續處於激活(非阻塞)狀態。而異步情況下是當一個進程發起一個函數(任務)調用的時候,不會等函數返回,而是繼續往下執行,當函數返回的時候通過狀態、通知、事件等方式通知進程任務完成。
  4. 阻塞與非阻塞針對的是進程或線程:阻塞是當請求不能滿足的時候就將進程掛起,而非阻塞則不會阻塞當前進程。

參考文獻:https://www.jianshu.com/p/47ee57646369


get與post的區別

 

  1. GET在瀏覽器回退時是無害的,而POST會再次提交請求。
  2. GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
  3. GET比POST更不安全,因爲參數直接暴露在URL上,所以不能用來傳遞敏感信息。
  4. GET參數通過URL傳遞,POST放在Request body中。
  5. GET請求在URL中傳送的參數是有長度限制的,而POST麼有,業界不成文的規定是,(大多數)瀏覽器通常都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url。
  6. GET/POST都是TCP鏈接
  7. GET產生一個TCP數據包;POST產生兩個TCP數據包。長的說:對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。

注意:

1、據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
2、並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。

鏈接:https://www.jianshu.com/p/7b9b44e850c8


__new__與__init__的區別

  1. new方法:實例化對象(開闢內存空間)
  2. init方法:對實例化對象進行初始化操作
  3. new方法和init方法會在創建對象時自動被調用,new方法在init方法之前被調用
  4. new方法實例化對象(創建一個內存空間),將實例化的對象return給init,init再對這個實例對象(內存空間)進行初始化屬性,如果new方法沒有return,init方法不會被調用

總結:
通過一個類創建對象時,會先自動調用new方法,開闢一個內存空間給實例化對象,然後return這個內存空間給init方法,init方法再對這個內存空間進行初始化操作

 


async與await

 

  • 雖然生成器和協程是兩個不同的概念,但是由於 Python 通過生成器實現協程,所以很容易認爲生成器和協程是相同的;一個函數是否是協程取決於函數體中是否有 yield 或者 yield from,這樣會導致重構代碼過程中引入不明顯的bug。async 能減少重構代碼導致的 bug通過引入 async ,我們可以更好的區分生成器和協程,消除了二義性。
  • 異步調用受限於 yield 表達式能出現的地方,即我們只能實現異步函數。通過引入 async ,我們可以定義異步 for 循環和異步上下文管理器。
  • 爲了簡化並更好地標識異步IO,Python在3.5版本中引入了關於協程的語法糖async和await,可以讓coroutine的代碼更簡潔易讀。
  • 請注意,async和await是針對coroutine的新語法,要使用新的語法,只需要做兩步簡單的替換:
  1. 把@asyncio.coroutine替換爲async;
  2. 把yield from替換爲await。
  • 完成異步的代碼不一定要用async/await,使用了async/await的代碼也不一定能做到異步,async/await是協程的語法糖,使協程之間的調用變得更加清晰,使用async修飾的函數調用時會返回一個協程對象,await只能放在async修飾的函數裏面使用,await後面必須要跟着一個協程對象或Awaitable,await的目的是等待協程控制流的返回,而實現暫停並掛起函數的操作是yield。
  • 正常的函數在執行時是不會中斷的,所以你要寫一個能夠中斷的函數,就需要添加async關鍵字。
  • async 用來聲明一個函數爲異步函數,異步函數的特點是能在函數執行過程中掛起,去執行其他異步函數,等到掛起條件(假設掛起條件是sleep(5))消失後,也就是5秒到了再回來執行。
  • await 用來用來聲明程序掛起,比如異步程序執行到某一步時需要等待的時間很長,就將此掛起,去執行其他的異步程序。
  • await 後面只能跟異步程序或有__await__屬性的對象,因爲異步程序與一般程序不同。假設有兩個異步函數async a,async b,a中的某一步有await,當程序碰到關鍵字await b()後,異步程序掛起後去執行另一個異步b程序,就是從函數內部跳出去執行其他函數,當掛起條件消失後,不管b是否執行完,要馬上從b程序中跳出來,回到原程序執行原來的操作。如果await後面跟的b函數不是異步函數,那麼操作就只能等b執行完再返回,無法在b執行的過程中返回。如果要在b執行完才返回,也就不需要用await關鍵字了,直接調用b函數就行。所以這就需要await後面跟的是異步函數了。在一個異步函數中,可以不止一次掛起,也就是可以用多個await。

參考文獻:

https://www.cnblogs.com/aademeng/articles/7239605.html
https://www.cnblogs.com/wwg945/p/9262357.html
https://www.cnblogs.com/aademeng/articles/7239512.html
https://zhuanlan.zhihu.com/p/27258289

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