看板 Python 關於我們 聯絡資訊
我目前的程式有兩個thread A與B. Thread A 會用append的方式寫入data 到list c裡面, thread B 會用for loop的方式從c的起頭開始讀取data. 想請教以下一個狀況. ------------------------------------------------------- 假設目前list裡面有100筆data. 然後thread B用以下方式開始讀取data. 讀取完之後,會把第1筆~第90筆data刪除. code如下. for idx,data in enumerate(c): print(data) del c[:91] Thread B讀取到第50筆data的時候, thread A append一筆data到c的最後面, code如下, c.append(data) ---------------------------------------------------------------- 想請問三個問題 1. Thread B 還能按造順序讀取原本list裡面的第1筆到第100筆data嗎? 2. Thread B 不會讀取到第101筆data對嗎? 3. Thread B 做完del這行code之後, c裡面會只剩第91~101筆data嗎? 我目前沒有使用mutex來同步這兩個thread的行為, 然後以上三個問題是我希望的程式執行結果. 想問如果不使用mutex的情況下, 程式會是這樣的執行結果嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.223.241 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1711360755.A.19C.html ※ 編輯: kakar0to (1.34.223.241 臺灣), 03/25/2024 18:00:02 ※ 編輯: kakar0to (42.73.232.254 臺灣), 03/25/2024 18:07:18
lycantrope: 為什麼不用queue 03/25 18:34
kakar0to: 好像是queue比較符合我想要的功能 03/25 18:51
kakar0to: 不過queue能夠peek嗎? 因為其實thread B可能只需要第一 03/25 18:53
kakar0to: 筆到第90筆data這樣, 91以後的不能刪除掉 03/25 18:53
kakar0to: 我可能要修改一下內文 03/25 18:54
※ 編輯: kakar0to (111.251.229.11 臺灣), 03/25/2024 18:55:30
wuyiulin: 你確定你用的是 thread?Python有 GIL 03/25 18:58
wuyiulin: 然後對,你應該用 queue 然後在 thread B 裡面自己寫 c 03/25 19:00
wuyiulin: ounter 解決讀取之類的 03/25 19:00
kakar0to: 但其實thread B要刪除到哪一筆, 是讀取過程中才知道的 03/25 19:13
kakar0to: 如果用queue get出來, 如果不能刪除, 還需要再放回queue 03/25 19:14
kakar0to: 原本的位置這樣 03/25 19:14
kakar0to: 第90筆是for loop過程中決定的, 在for loop之前是不知道 03/25 19:17
kakar0to: 的 03/25 19:17
wuyiulin: 有重複元素嗎?沒有的話宣告一個存tmp檢查 當 thread B 03/25 19:22
wuyiulin: 觸發條件就存,然後進 while 一直刪直到這個元素 03/25 19:22
wuyiulin: 不然你也可以觸發後反向一路刪到頭 03/25 19:23
wuyiulin: 幹不對啊是 Python 03/25 19:27
wuyiulin: 好 假設你讀到第N個觸發刪除 03/25 19:27
wuyiulin: 應該可以 list = list[N:] 這樣就好了 03/25 19:28
kakar0to: 了解 我感覺我是不是加個mutex就好, 這樣好像比較簡化 03/25 19:39
kakar0to: 問題 03/25 19:39
wuyiulin: 加鎖是保險,看你有什麼需求怎麼用,因為有鎖也有會上 03/25 19:44
wuyiulin: 鎖跟釋放的時間消耗。 03/25 19:44
wuyiulin: 我得到的觀念最好還是 Lock free 啦,請其他人補充 03/25 19:45
kakar0to: 對 我也是不想用mutex 03/25 19:56
kakar0to: 那想問wuy大 你知道第一個與第二個問題的答案嗎? 03/25 19:57
kakar0to: 還是已經回答了 哈 03/25 19:57
kakar0to: 不過wuy大有提到GIL, 所以python是不是沒有thread這種東 03/25 20:01
kakar0to: 西? 我問的問題是不存在的問題? 03/25 20:01
kakar0to: 因為我的程式是一個process,然後會提供一個callback 03/25 20:02
kakar0to: function給一個外部的module來呼叫, 這個module不是我 03/25 20:02
kakar0to: 寫的, 所以我不太知道這個module是怎麼樣的方式去call 03/25 20:02
kakar0to: 這個callback function. 然後callback function裡面就是 03/25 20:03
kakar0to: append一個data到我的process提供的list裡面 03/25 20:03
kakar0to: 然後我的process會定期去檢查list裡面的data, 然後刪除 03/25 20:03
kakar0to: 前面的部分. 現在我擔心同時append以及刪除會不會有什麼 03/25 20:04
kakar0to: 問題. 03/25 20:04
kakar0to: 不過會不會不會同時append與刪除, 因為python GIL的限制 03/25 20:05
wuyiulin: 會,資料可能會裂開,但是你丟個簡單範例跑看看 03/25 23:20
wuyiulin: 第一個問題可以,如果你是用索引去拿 list 元素 03/25 23:21
wuyiulin: 第二個問題要看你怎麼設計程式 03/25 23:21
lycantrope: ... 03/26 09:54