我的代码按预期运行良好,但我想改进它。当循环进入 100 秒这样的长时间睡眠时,我如何强制它立即改变。如果我错过输入并输入 400s 而不是 4s,我将不得不重新启动程序,这很烦人。在这里你可以看到代码 我尝试了很多东西,比如制作其他变量等,但我是新手,安静地迷失了。
`import paho.mqtt.client
import time
import threading
monClientMqtt = paho.mqtt.client.Client()
monClientMqtt.connect("localhost",1883)
monClientMqtt.loop_start()
monClientMqtt.subscribe("option")
monClientMqtt.subscribe("periodeX")
monClientMqtt.subscribe("mesureX")
monClientMqtt.subscribe("periodeY")
monClientMqtt.subscribe("mesureY")
monClientMqtt.subscribe("valeurX")
monClientMqtt.subscribe("valeurY")
periodeX =1
mesureX=0
x=0
y=0
periodeY=1
mesureY=0
def CallBack (client, userdata,message) :
global x,periodeX,mesureX,y, periodeY,mesureY
print(message.topic)
print(message.payload)
if message.topic == "option" :
if message.payload.decode() == "restartX" :
x=0
if message.payload.decode()=="restartY":
y=0
if message.topic =="mesureX":
try:
mesureX=float(message.payload.decode())
except ValueError:
print("0 ou 1")
if message.topic =="periodeX" :
try:
periodeX=float(message.payload.decode())
except ValueError :
print("Veuillez entrer un nombre")
if message.topic =="mesureY":
try:
mesureY=float(message.payload.decode())
except ValueError:
print("0 ou 1")
if message.topic =="periodeY" :
try:
periodeY=float(message.payload.decode())
except ValueError :
print("Veuillez entrer un nombre")
def prendremesureX():
while True:
if mesureX==0:
global x,periodeX
x+=1
monClientMqtt.publish("valeurX",x)
time.sleep(periodeX)
def prendremesureY():
while True :
if mesureY==0:
global y,periodeY
y+=1
monClientMqtt.publish("valeurY",y)
time.sleep(periodeY)
threadX=threading.Thread(target=prendremesureX)
threadY=threading.Thread(target=prendremesureY)
monClientMqtt.on_message=CallBack
threadX.start()
threadY.start()
请参阅其他指导您如何正确提问/如何使用堆栈溢出的评论。
抛开问题,如果我正确理解你的问题,你就是在问; “如果有紧急需要,我该如何调整支票的延迟?”
您的 current 实施的问题是您正在使用 time.sleep()
,它在功能上暂停任何处理,直到时间范围到期。正如您所发现的那样,这是行不通的,因为在睡眠期间无法进行任何更改。
你要做的是创建一个任务调度程序。您可能希望为特定任务分配日期或时间,并有一个任务处理程序可以根据特定时间处理每个任务。
后续如果有需要紧急处理的,可以更新任务的预定时间,按需处理。