[問題] python list問題

看板Python作者 (Poker Face)時間1月前 (2024/03/25 17:59), 1月前編輯推噓3(3039)
留言42則, 3人參與, 1月前最新討論串1/1
我目前的程式有兩個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

03/25 18:34, 1月前 , 1F
為什麼不用queue
03/25 18:34, 1F

03/25 18:51, 1月前 , 2F
好像是queue比較符合我想要的功能
03/25 18:51, 2F

03/25 18:53, 1月前 , 3F
不過queue能夠peek嗎? 因為其實thread B可能只需要第一
03/25 18:53, 3F

03/25 18:53, 1月前 , 4F
筆到第90筆data這樣, 91以後的不能刪除掉
03/25 18:53, 4F

03/25 18:54, 1月前 , 5F
我可能要修改一下內文
03/25 18:54, 5F
※ 編輯: kakar0to (111.251.229.11 臺灣), 03/25/2024 18:55:30

03/25 18:58, 1月前 , 6F
你確定你用的是 thread?Python有 GIL
03/25 18:58, 6F

03/25 19:00, 1月前 , 7F
然後對,你應該用 queue 然後在 thread B 裡面自己寫 c
03/25 19:00, 7F

03/25 19:00, 1月前 , 8F
ounter 解決讀取之類的
03/25 19:00, 8F

03/25 19:13, 1月前 , 9F
但其實thread B要刪除到哪一筆, 是讀取過程中才知道的
03/25 19:13, 9F

03/25 19:14, 1月前 , 10F
如果用queue get出來, 如果不能刪除, 還需要再放回queue
03/25 19:14, 10F

03/25 19:14, 1月前 , 11F
原本的位置這樣
03/25 19:14, 11F

03/25 19:17, 1月前 , 12F
第90筆是for loop過程中決定的, 在for loop之前是不知道
03/25 19:17, 12F

03/25 19:17, 1月前 , 13F
03/25 19:17, 13F

03/25 19:22, 1月前 , 14F
有重複元素嗎?沒有的話宣告一個存tmp檢查 當 thread B
03/25 19:22, 14F

03/25 19:22, 1月前 , 15F
觸發條件就存,然後進 while 一直刪直到這個元素
03/25 19:22, 15F

03/25 19:23, 1月前 , 16F
不然你也可以觸發後反向一路刪到頭
03/25 19:23, 16F

03/25 19:27, 1月前 , 17F
幹不對啊是 Python
03/25 19:27, 17F

03/25 19:27, 1月前 , 18F
好 假設你讀到第N個觸發刪除
03/25 19:27, 18F

03/25 19:28, 1月前 , 19F
應該可以 list = list[N:] 這樣就好了
03/25 19:28, 19F

03/25 19:39, 1月前 , 20F
了解 我感覺我是不是加個mutex就好, 這樣好像比較簡化
03/25 19:39, 20F

03/25 19:39, 1月前 , 21F
問題
03/25 19:39, 21F

03/25 19:44, 1月前 , 22F
加鎖是保險,看你有什麼需求怎麼用,因為有鎖也有會上
03/25 19:44, 22F

03/25 19:44, 1月前 , 23F
鎖跟釋放的時間消耗。
03/25 19:44, 23F

03/25 19:45, 1月前 , 24F
我得到的觀念最好還是 Lock free 啦,請其他人補充
03/25 19:45, 24F

03/25 19:56, 1月前 , 25F
對 我也是不想用mutex
03/25 19:56, 25F

03/25 19:57, 1月前 , 26F
那想問wuy大 你知道第一個與第二個問題的答案嗎?
03/25 19:57, 26F

03/25 19:57, 1月前 , 27F
還是已經回答了 哈
03/25 19:57, 27F

03/25 20:01, 1月前 , 28F
不過wuy大有提到GIL, 所以python是不是沒有thread這種東
03/25 20:01, 28F

03/25 20:01, 1月前 , 29F
西? 我問的問題是不存在的問題?
03/25 20:01, 29F

03/25 20:02, 1月前 , 30F
因為我的程式是一個process,然後會提供一個callback
03/25 20:02, 30F

03/25 20:02, 1月前 , 31F
function給一個外部的module來呼叫, 這個module不是我
03/25 20:02, 31F

03/25 20:02, 1月前 , 32F
寫的, 所以我不太知道這個module是怎麼樣的方式去call
03/25 20:02, 32F

03/25 20:03, 1月前 , 33F
這個callback function. 然後callback function裡面就是
03/25 20:03, 33F

03/25 20:03, 1月前 , 34F
append一個data到我的process提供的list裡面
03/25 20:03, 34F

03/25 20:03, 1月前 , 35F
然後我的process會定期去檢查list裡面的data, 然後刪除
03/25 20:03, 35F

03/25 20:04, 1月前 , 36F
前面的部分. 現在我擔心同時append以及刪除會不會有什麼
03/25 20:04, 36F

03/25 20:04, 1月前 , 37F
問題.
03/25 20:04, 37F

03/25 20:05, 1月前 , 38F
不過會不會不會同時append與刪除, 因為python GIL的限制
03/25 20:05, 38F

03/25 23:20, 1月前 , 39F
會,資料可能會裂開,但是你丟個簡單範例跑看看
03/25 23:20, 39F

03/25 23:21, 1月前 , 40F
第一個問題可以,如果你是用索引去拿 list 元素
03/25 23:21, 40F

03/25 23:21, 1月前 , 41F
第二個問題要看你怎麼設計程式
03/25 23:21, 41F

03/26 09:54, 1月前 , 42F
...
03/26 09:54, 42F
文章代碼(AID): #1c0Khp6S (Python)
文章代碼(AID): #1c0Khp6S (Python)