我正在处理从数据流中读取命令的事情。我试图在Python中制作一个可重复使用的非阻塞倒计时器,以解决触发器问题。所以我开始了一个小程序,只需要键盘输入和一些基本的线程来计算逻辑。我发现了一些帖子和帖子(How to create a trigger with threading.Timer?),这非常有用。但我需要另一部分的帮助。
现在我的逻辑是:"每次命令的值为1时,调用start"
如何更新我的逻辑: "如果命令值为1个呼叫开始,只要命令值保持为1,就不要再次调用start。
所以它更像是一个值变化检测而不是普通的if / else,或者我必须在某个地方跟踪一个布尔值。我只是不确定如何处理它。
#! /usr/bin/env python
import time
import threading
import random
from random import randint
import logging
from sys import argv
logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)-10s) %(message)s')
def countdown(pName,command):
print("{0} countdown - command{1} ".format(pName,command))
retry = 0
while True:
print("{0}:{1}".format(pName,retry))
retry += 1
if retry > randint(5,10):
break
time.sleep(1)
print("{0} ended".format(pName))
def start(pName,command):
print("starting countdown for: ",pName)
t = threading.Thread(target=countdown,args=(pName,command))
t.setName(pName)
t.setDaemon(True)
t.start()
if __name__ == "__main__":
while 1:
command = int(input("[1 or 2] >"))
if command == 1:
start("Salad",command)
elif command == 2:
start("Bingo",command)
现在这是相当粗野的,但它只是第一次试图解开它。
谢谢!
答案 0 :(得分:1)
您需要功能isAlive。首先,您必须将您的线程变量移动到main函数,以便main具有调用thread.isAlive()
的适当范围。
if __name__ == "__main__":
tSalad = threading.Thread()
tBingo = threading.Thread()
while 1:
command = int(input("[1 or 2] >"))
if command == 1 and not tSalad.isAlive():
tSalad = threading.Thread(target = countdown, args=("Salad", 1))
start("Salad", tSalad)
elif command == 2 and not tBingo.isAlive():
tBingo = threading.Thread(target = countdown, args=("Bingo", 2))
start("Bingo", tBingo)
然后你修改你的开始'函数来获取一个线程参数:
def start(pName, t):
print("starting countdown for: ",pName)
t.setName(pName)
t.setDaemon(True)
t.start()
这应该适合你。