Python线程计时器

2024-04-23 22:18:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在这段代码中,我希望看到列表中的一个随机元素在至少5秒钟内变为1。我经常看到一个元素在几个迭代中变为1,然后被重置为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)

Tags: 代码import元素列表indextimedefrandom
1条回答
网友
1楼 · 发布于 2024-04-23 22:18:31

这是因为可能有多个计时器等待重置同一索引。假设在第一轮和第三轮random.randint返回相同的索引。在前五轮的输出中,索引为1。然后在第六轮中,输出将被重置回0,正如您所期望的那样

现在,如果random.randint在第七轮再次返回相同的索引,那么输出将显示为1的索引。然后在第八轮之前,在第三轮上设置的计时器将重置索引,从而在第八轮输出上显示为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)

相关问题 更多 >