[问题] 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