我正在致力於ddbmock project。基本上,這是一臺再現亞馬遜DynamoDB API的服務器。如何在Python中驗證我的線程安全模型?
即使此實現不直接涉及線程,它很可能會在多線程環境中運行,並且此刻,我知道它具有不可預知的「功能」:)所有線程都將在同一個存儲中工作...
第一步將添加互斥體,但我怎麼測試我沒有錯過任何設計實際工作?有沒有可靠的方法?
我正在致力於ddbmock project。基本上,這是一臺再現亞馬遜DynamoDB API的服務器。如何在Python中驗證我的線程安全模型?
即使此實現不直接涉及線程,它很可能會在多線程環境中運行,並且此刻,我知道它具有不可預知的「功能」:)所有線程都將在同一個存儲中工作...
第一步將添加互斥體,但我怎麼測試我沒有錯過任何設計實際工作?有沒有可靠的方法?
@martineau,問題不限於CPython。任何時候共享資源都會導致併發問題。
一種方法是完全避免它。序列化所有內容並且不允許併發。鑑於這是一個內存模擬服務器,這可能是一個合理的限制。
但是,如果您確實想要提供並行訪問,我將使用的策略是長時間使用各種請求對系統進行壓力測試。這傾向於擺脫很多種族條件錯誤。否則,我知道沒有可靠的方法來證明程序沒有併發錯誤。
手錶this你會意識到有沒有方法可靠地做你想在CPython。 這只是因爲python推遲到操作系統一切。它不以任何方式控制(主動)調度,它只是釋放GIL,有時讓操作系統執行上下文切換如果和當它想要。這在多核計算機上有一些醜陋的後果。
無論如何在其他語言中,它也是真的硬要做的事情。調試併發程序是一個地獄,這就是爲什麼你應該儘可能避免它(如果你想進行可靠的測試)。
假設你有一個單元測試套件,你應該添加更多在線程環境中使用庫的測試。 – kcbanner
@kcbanner線程錯誤的問題在於它們不是確定性的,因此幾乎不可能可靠地進行測試(我知道一些似乎工作得比較好的嘗試,但是它們通過劫持上下文切換來工作,是特定於平臺的,而且沒有他們是爲Python)。 – delnan
我熟悉的所有單元測試環境都假定單線程執行。由於非確定性性質,多線程運行單元測試無助於識別併發性問題。但是它會破壞你的單元測試,因爲測試和庫通常不是爲了運行多線程而設計的。 –