国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

在Python中測試訪問同一數據的競爭條件的方法

2020-02-23 00:50:05
字體:
來源:轉載
供稿:網友

當你有多個進程或線程訪問相同的數據時,競爭條件是一個威脅。本文探討了在發現競爭條件后如何測試它們。

Incrmnt

你在一個名為“Incrmnt”的火熱新創公司工作,該公司只做一件事情,并且做得比較好。

你展示一個全局計數器和一個加號,用戶可以點擊加號,此時計數器加一。這太簡單了,而且容易使人上癮。毫無疑問這就是接下來的大事情。

投資者們爭先恐后的進入了董事會,但你有一個大問題。

競爭條件

在你的內測中,Abraham和Belinda是如此的興奮,以至于每個人都點了100次加號按鈕。你的服務器日志顯示了200次請求,但計數器卻顯示為173。很明顯,有一些請求沒有被加上。

先將“Incrmnt變成了一坨屎”的新聞拋到腦后,你檢查下代碼(本文用到的所有代碼都能在Github上找到)。
 

# incrmnt.pyimport db def increment():  count = db.get_count()   new_count = count + 1  db.set_count(new_count)   return new_count

你的Web服務器使用多進程處理流量請求,所以這個函數能在不同的線程中同時執行。如果你沒掌握好時機,將會發生:
 

# 線程1和線程2在不同的進程中同時執行# 為了展示的目的,在這里并排放置# 在垂直方向分開它們,以說明在每個時間點上執行什么代碼# Thread 1(線程1)         # Thread 2(線程2)def increment():                  def increment():  # get_count returns 0  count = db.get_count()                    # get_count returns 0 again                    count = db.get_count()  new_count = count + 1  # set_count called with 1  db.set_count(new_count)                    new_count = count + 1                    # set_count called with 1 again                    db.set_count(new_count)

所以盡管增加了兩次計數,但最終只增加了1。

你知道你可以修改這個代碼,變為線程安全的,但是在你那么做之前,你還想寫一個測試證明競爭的存在。

重現競爭

在理想情況下,測試應該盡可能的重現上面的場景。競爭的關鍵因素是:

?兩個 get_count 調用必須在兩個 set_count 調用之前執行,從而使得兩個線程中的計數具有相同的值。

set_count 調用,什么時候執行都沒關系,只要它們都在 get_count 調用之后即可。

簡單起見,我們試著重現這個嵌套的情形。這里整 個Thread 2 在 Thread 1 的首個 get_count 調用之后執行:

 

# Thread 1             # Thread 2def increment():  # get_count returns 0  count = db.get_count()                  def increment():                    # get_count returns 0 again                    count = db.get_count()                     # set_count called with 1                    new_count = count + 1                    db.set_count(new_count)  # set_count called with 1 again  new_count = count + 1  db.set_count(new_count)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 六枝特区| 分宜县| 黄平县| 扬州市| 日喀则市| 随州市| 武宣县| 简阳市| 盐津县| 双辽市| 桦南县| 颍上县| 安丘市| 昌乐县| 搜索| 固镇县| 鄂尔多斯市| 沙坪坝区| 靖安县| 龙岩市| 济阳县| 桂平市| 鄂托克旗| 淅川县| 垫江县| 平顶山市| 宾川县| 花莲县| 伊春市| 高安市| 阳泉市| 麟游县| 南溪县| 冕宁县| 仙游县| 高台县| 永康市| 济阳县| 新密市| 新密市| 九龙城区|