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