Python线程计时器问题

时间:2016-03-24 02:39:42

标签: python timer

在这段代码中,我希望看到列表中的随机元素变为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)

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)