[問題] python list問題

作者: kakar0to (Poker Face)   2024-03-25 17:59:12
我目前的程式有兩個thread A與B. Thread A 會用append的方式寫入data
到list c裡面, thread B 會用for loop的方式從c的起頭開始讀取data.
想請教以下一個狀況.
作者: lycantrope (阿寬)   2024-03-25 18:34:00
為什麼不用queue
作者: kakar0to (Poker Face)   2024-03-25 18:51:00
好像是queue比較符合我想要的功能不過queue能夠peek嗎? 因為其實thread B可能只需要第一筆到第90筆data這樣, 91以後的不能刪除掉我可能要修改一下內文
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2024-03-25 18:58:00
你確定你用的是 thread?Python有 GIL然後對,你應該用 queue 然後在 thread B 裡面自己寫 counter 解決讀取之類的
作者: kakar0to (Poker Face)   2024-03-25 19:13:00
但其實thread B要刪除到哪一筆, 是讀取過程中才知道的如果用queue get出來, 如果不能刪除, 還需要再放回queue原本的位置這樣第90筆是for loop過程中決定的, 在for loop之前是不知道的
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2024-03-25 19:22:00
有重複元素嗎?沒有的話宣告一個存tmp檢查 當 thread B觸發條件就存,然後進 while 一直刪直到這個元素不然你也可以觸發後反向一路刪到頭幹不對啊是 Python好 假設你讀到第N個觸發刪除應該可以 list = list[N:] 這樣就好了
作者: kakar0to (Poker Face)   2024-03-25 19:39:00
了解 我感覺我是不是加個mutex就好, 這樣好像比較簡化問題
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2024-03-25 19:44:00
加鎖是保險,看你有什麼需求怎麼用,因為有鎖也有會上鎖跟釋放的時間消耗。我得到的觀念最好還是 Lock free 啦,請其他人補充
作者: kakar0to (Poker Face)   2024-03-25 19:56:00
對 我也是不想用mutex那想問wuy大 你知道第一個與第二個問題的答案嗎?還是已經回答了 哈不過wuy大有提到GIL, 所以python是不是沒有thread這種東西? 我問的問題是不存在的問題?因為我的程式是一個process,然後會提供一個callbackfunction給一個外部的module來呼叫, 這個module不是我寫的, 所以我不太知道這個module是怎麼樣的方式去call這個callback function. 然後callback function裡面就是append一個data到我的process提供的list裡面然後我的process會定期去檢查list裡面的data, 然後刪除前面的部分. 現在我擔心同時append以及刪除會不會有什麼問題.不過會不會不會同時append與刪除, 因為python GIL的限制
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2024-03-25 23:20:00
會,資料可能會裂開,但是你丟個簡單範例跑看看第一個問題可以,如果你是用索引去拿 list 元素第二個問題要看你怎麼設計程式
作者: lycantrope (阿寬)   2024-03-26 09:54:00
...

Links booklink

Contact Us: admin [ a t ] ucptt.com