在这段代码中,我希望看到列表中的随机元素变为1至少5秒。经常我看到一个元素只进行了几次迭代,然后重置为0.我错过了什么?是否与不关闭的线程有关?有人可以告诉我如何解决它吗?
import threading
import random
import time
def lreset(x):
global flags
flags[x] = 0
return
flags = [0,0,0,0,0,0,0,0]
while True:
index = random.randint(0,7)
flags[index] = 1
t = threading.Timer(5, lreset, [index])
t.start()
print flags
time.sleep(1)
答案 0 :(得分:1)
这是因为可能有多个计时器等待重置相同的索引。想象一下,在第一轮和第三轮random.randint
返回相同的索引。在前五轮的输出中,索引为1
。然后在第六轮中,输出将重置为0
,就像您期望的那样。
现在,如果random.randint
在第七轮再次返回相同的索引,则输出会将索引显示为1
。然后在第8轮之前,在第三轮设置的计时器将重置索引,因此它将在八轮输出上显示为0
。
获得预期行为的一种方法是确保在设置索引时不设置索引:
while True:
index = random.randint(0,7)
if flags[index] == 0:
flags[index] = 1
t = threading.Timer(5, lreset, [index])
t.start()
print flags
time.sleep(1)