場景:假設我有一個用 Python 撰寫的 REST API(可能使用 Flask),它存盤了一個全域變數。API 有兩個端點,一個讀取變數并回傳它,另一個寫入它。現在,我有兩個客戶端同時呼叫兩個端點(一個讀取,一個寫入)。
我知道在 Python 中多個執行緒實際上不會同時運行(由于 GIL),但是有一些 I/O 操作表現為異步,這種情況會導致任何沖突嗎?它的行為如何,我假設“贏得比賽”的請求將持有另一個請求(對嗎)?
uj5u.com熱心網友回復:
簡而言之:你應該過度考慮你的 rest api 設計并實作某種 fifo 佇列。
您必須使用端點(W 用于寫入,R 用于讀取)。假設全域變數在開始時有一些值 V0。如果客戶端 A 從 R 讀取資料,同時客戶端 B 向 W 寫入資料。可能會發生兩件事。
- 讀取請求更快。客戶端 A 將讀取 V0。
- 寫請求更快。客戶端 A 將讀取 V1。
由于您提到的 GIL,您不會遇到不一致的記憶體狀態,但是上面發生的哪種情況是完全不可預測的。一次讀取請求可能會稍微快一點,而另一次寫入請求可能會稍微快一點。大部分請求處理是在您的作業系統中完成的(例如地址決議或 TCP 連接管理)。此外,請求可能會遍歷您網路中的其他機器,例如路由器或交換機。所有這些事情都完全超出了您的控制范圍,并且可能會比寫入請求稍微延遲讀取請求或相反。所以不管你運行 REST 服務器有多少執行緒,回傳值幾乎是不可預測的。
如果確實需要有序的讀寫互動,可以將資源設為fifo佇列。所以每次任何客戶端讀取時,它都會從佇列中彈出第一個元素。每次任何客戶端寫入時,它都會將該元素推送到佇列的末尾。如果這樣做,您可以保證不會因覆寫而丟失任何資料,并且您可以按照與寫入相同的順序讀取資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/420702.html
標籤:
