看板 Python 關於我們 聯絡資訊
我在使用一套測試軟體,只需提供被呼叫的函式 沒有測試軟的程式碼,只有被呼叫的函式 環境是ubuntu20.04, python是3.8.10 流程大約如下,可以一次進行多台設備測試 init -> ge_set -> test -> teardown -> clean 其中我在init和get_sn中使用同樣的程式,但是 似乎在init中Lock無效,但是get_sn中有效,不 知道是否有人能提供意見? 程式大約如下 ======================================== class G: pass G.duts = None Lock = threading.Lock() def init(logger): with Lock: logger.info(str(G.duts)) if G.duts is None: G.duts = 1 logger.info(str(G.duts)) def get_sn(test_data): """ with Lock: test_data.logger.info(str(G.duts)) if G.duts is None: G.duts = 1 test_data.logger.info(str(G.duts)) """ def clean(logger): G.duts = None ======================================== 一次進行兩台設備的測試時, 在init印出來的輸出分別是 None 1 和 None 1 如果改在get_sn印出來的是 None 1 和 1 1 在init中,我有試過os.getpid(), 回傳的數字相同 應該不是不同process 還是我的Lock使用方法有誤? 我試過以下,結果也一樣。 Lock.acquire() Lock.release() -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.136.121.134 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1653698836.A.7A0.html
lycantrope: 貼上來的部分感覺沒什麼問題,可能其他地方有寫錯吧 05/28 10:49
謝謝。我再查查程式碼。 不過之前找了半天也沒找到問題, 大約我是查不出來了 ※ 編輯: tsaiminghan (220.136.121.134 臺灣), 05/28/2022 13:53:45
lycantrope: lock只是確保單一thread存取,不保證順序啊 05/28 14:16
Woqeker: 改用外部的 lock? redis 之類的 05/28 14:29
aalexx: 那兩個function都是class static??? 06/07 03:15
後來想一下,應該是我弄錯了,雖然GUI上, 兩個地方都有init的log,但是應該是只 呼叫了一次init,但是log兩邊都會顯示 ※ 編輯: tsaiminghan (220.136.123.1 臺灣), 01/13/2023 20:00:09