Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在值更改时触发线程(python)_Python_Multithreading_Python 3.x_Logic - Fatal编程技术网

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

仅在值更改时触发线程(python),python,multithreading,python-3.x,logic,Python,Multithreading,Python 3.x,Logic,我正在研究从数据流中读取命令的东西。我一直在努力在Python中制作一个可重用的非阻塞倒计时,这个倒计时不需要触发器。所以我启动了一个小程序,只需要键盘输入和一些基本的线程来计算逻辑。我发现了一些帖子,这篇帖子()非常有用。但我需要一些人帮我做另一件事 现在我的逻辑是:“每次command的值是1 call start” 如何将我的逻辑更新为: 如果command的值为1,则只要command的值保持为1,就不要再次调用start 所以它更多的是一个值变化检测,而不是一个普通的if/else,或

我正在研究从数据流中读取命令的东西。我一直在努力在Python中制作一个可重用的非阻塞倒计时,这个倒计时不需要触发器。所以我启动了一个小程序,只需要键盘输入和一些基本的线程来计算逻辑。我发现了一些帖子,这篇帖子()非常有用。但我需要一些人帮我做另一件事

现在我的逻辑是:“每次command的值是1 call start”

如何将我的逻辑更新为: 如果command的值为1,则只要command的值保持为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)
这是相当残忍的现在,但这只是第一次过去尝试和困惑它

谢谢!

您需要该函数。首先,您必须将线程变量移动到main函数,以便main具有调用
thread.isAlive()
的适当范围

然后修改“start”函数以获取线程参数:

def start(pName, t):
    print("starting countdown for: ",pName)
    t.setName(pName)
    t.setDaemon(True)
    t.start()

这应该对你有帮助。

让线程在开始和结束时设置一个标志?写/读简单变量是线程安全的,所以让主线程和子线程访问同一个标志。或者你可以使用线程锁作为你的标志。如果你有时间,你能在下面抛出一个答案吗?当你说flag I'm thi时NK真/假布尔值。这会起作用,有时会让人毛骨悚然。DJ McMayhem的答案基本上使用了一个内置的标志,甚至更好!我知道,这很好,只是在这个特定的设置中不起作用。:-/我要尝试一堆布尔值,然后从那里开始。@mishap\n它怎么办?我可能误解了你想要的。如果如果您告诉我出了什么问题,我会更新我的答案。我知道这是对的,但我不能让这些东西在main中运行。数据流被拉入main,所有东西都被发送到helper函数。我使用.isAlive()尝试了一些东西它永远不会像死了一样开火。@misshap\n好吧,你必须在main中有一些东西。我想你可以把它放在一个类中,但是你必须在main中保留该类的一个对象。不管你怎么做,main都需要看到线程。
def start(pName, t):
    print("starting countdown for: ",pName)
    t.setName(pName)
    t.setDaemon(True)
    t.start()