仅在值更改时触发线程(python)

时间:2016-01-27 00:35:16

标签: python multithreading python-3.x logic

我正在处理从数据流中读取命令的事情。我试图在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)

现在这是相当粗野的,但它只是第一次试图解开它。

谢谢!

1 个答案:

答案 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()

这应该适合你。