作者kakar0to (Poker Face)
看板Python
標題[問題] python list問題
時間Mon Mar 25 17:59:12 2024
我目前的程式有兩個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://webptt.com/m.aspx?n=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
1F:→ lycantrope: 為什麼不用queue 03/25 18:34
2F:→ kakar0to: 好像是queue比較符合我想要的功能 03/25 18:51
3F:→ kakar0to: 不過queue能夠peek嗎? 因為其實thread B可能只需要第一 03/25 18:53
4F:→ kakar0to: 筆到第90筆data這樣, 91以後的不能刪除掉 03/25 18:53
5F:→ kakar0to: 我可能要修改一下內文 03/25 18:54
※ 編輯: kakar0to (111.251.229.11 臺灣), 03/25/2024 18:55:30
6F:→ wuyiulin: 你確定你用的是 thread?Python有 GIL 03/25 18:58
7F:→ wuyiulin: 然後對,你應該用 queue 然後在 thread B 裡面自己寫 c 03/25 19:00
8F:→ wuyiulin: ounter 解決讀取之類的 03/25 19:00
9F:→ kakar0to: 但其實thread B要刪除到哪一筆, 是讀取過程中才知道的 03/25 19:13
10F:→ kakar0to: 如果用queue get出來, 如果不能刪除, 還需要再放回queue 03/25 19:14
11F:→ kakar0to: 原本的位置這樣 03/25 19:14
12F:→ kakar0to: 第90筆是for loop過程中決定的, 在for loop之前是不知道 03/25 19:17
13F:→ kakar0to: 的 03/25 19:17
14F:推 wuyiulin: 有重複元素嗎?沒有的話宣告一個存tmp檢查 當 thread B 03/25 19:22
15F:→ wuyiulin: 觸發條件就存,然後進 while 一直刪直到這個元素 03/25 19:22
16F:→ wuyiulin: 不然你也可以觸發後反向一路刪到頭 03/25 19:23
17F:→ wuyiulin: 幹不對啊是 Python 03/25 19:27
18F:→ wuyiulin: 好 假設你讀到第N個觸發刪除 03/25 19:27
19F:→ wuyiulin: 應該可以 list = list[N:] 這樣就好了 03/25 19:28
20F:→ kakar0to: 了解 我感覺我是不是加個mutex就好, 這樣好像比較簡化 03/25 19:39
21F:→ kakar0to: 問題 03/25 19:39
22F:推 wuyiulin: 加鎖是保險,看你有什麼需求怎麼用,因為有鎖也有會上 03/25 19:44
23F:→ wuyiulin: 鎖跟釋放的時間消耗。 03/25 19:44
24F:→ wuyiulin: 我得到的觀念最好還是 Lock free 啦,請其他人補充 03/25 19:45
25F:→ kakar0to: 對 我也是不想用mutex 03/25 19:56
26F:→ kakar0to: 那想問wuy大 你知道第一個與第二個問題的答案嗎? 03/25 19:57
27F:→ kakar0to: 還是已經回答了 哈 03/25 19:57
28F:→ kakar0to: 不過wuy大有提到GIL, 所以python是不是沒有thread這種東 03/25 20:01
29F:→ kakar0to: 西? 我問的問題是不存在的問題? 03/25 20:01
30F:→ kakar0to: 因為我的程式是一個process,然後會提供一個callback 03/25 20:02
31F:→ kakar0to: function給一個外部的module來呼叫, 這個module不是我 03/25 20:02
32F:→ kakar0to: 寫的, 所以我不太知道這個module是怎麼樣的方式去call 03/25 20:02
33F:→ kakar0to: 這個callback function. 然後callback function裡面就是 03/25 20:03
34F:→ kakar0to: append一個data到我的process提供的list裡面 03/25 20:03
35F:→ kakar0to: 然後我的process會定期去檢查list裡面的data, 然後刪除 03/25 20:03
36F:→ kakar0to: 前面的部分. 現在我擔心同時append以及刪除會不會有什麼 03/25 20:04
37F:→ kakar0to: 問題. 03/25 20:04
38F:→ kakar0to: 不過會不會不會同時append與刪除, 因為python GIL的限制 03/25 20:05
39F:推 wuyiulin: 會,資料可能會裂開,但是你丟個簡單範例跑看看 03/25 23:20
40F:→ wuyiulin: 第一個問題可以,如果你是用索引去拿 list 元素 03/25 23:21
41F:→ wuyiulin: 第二個問題要看你怎麼設計程式 03/25 23:21
42F:→ lycantrope: ... 03/26 09:54