作者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/cn.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