странное поведение while l oop с time.sleep более 90 с - PullRequest
0 голосов
/ 18 июня 2020

Я изо всех сил пытаюсь понять "странное" поведение моего простого скрипта. В принципе, он работает должным образом, если time.sleep () установлен как 60 с, но как только я устанавливаю значение выше 90 (90 - это, по-видимому, предел в моем случае), l oop не работает должным образом. Я обнаружил это, когда пытался приостановить скрипт на 3 минуты.

Вот мой скрипт

from gpiozero import CPUTemperature
import time
import paho.mqtt.client as mqtt #import the client1
import psutil

broker_address="192.168.1.17"
client = mqtt.Client("P1") #create new instance
client.connect(broker_address) #connect to broker

#time.sleep(60)


while True:
    cpu = CPUTemperature()
    print(cpu.temperature)
    #a=cpu.temperature
    #print(psutil.cpu_percent())
    #print(psutil.virtual_memory()[2])
    #print(a)
    client.publish("test/message",cpu.temperature)
    #client.publish("test/ram", psutil.virtual_memory()[2])
    #client.publish("test/cpu", psutil.cpu_percent())
    time.sleep(91)

В этом случае с 91 с он просто печатает значение cpu.temperature каждые 91 с , тогда как при значении вроде 60s, помимо печати, он также публикует значение через mqtt каждый цикл.

Я что-то здесь не так делаю? Или для более длительного сна мне нужно сменить код? Я запускаю это на RaspberryPi.

Заранее спасибо

РЕДАКТИРОВАТЬ:

Я решил изменить скрипт, в частности, как mqtt обрабатывал время

вот новый скрипт

mqttc=mqtt.Client("P1")
#mqttc.on_connect = onConnect
#mqttc.on_disconnect = onDisconnect
mqttc.connect("192.168.1.17", port=1883, keepalive=60)
mqttc.loop_start()
while True:
    cpu = CPUTemperature()
    print(cpu.temperature)
    mqttc.publish("test/message",cpu.temperature)
    time.sleep(300)

1 Ответ

0 голосов
/ 18 июня 2020

Клиент MQTT использует сетевой поток для обработки ряда различных аспектов соединения с брокером.

Во-первых, он обрабатывает отправку запроса ping брокеру, чтобы поддерживать соединение. По умолчанию период проверки активности составляет 60 секунд. Соединение будет разорвано брокером, если он не получит никаких сообщений в 1,5 раза превышающем это значение, которое просто составляет 90 секунд.

Во-вторых, поток обрабатывает любые входящие сообщения, на которые клиент мог подписаться .

В-третьих, если вы попытаетесь опубликовать sh сообщение, размер которого превышает MTU сетевой ссылки, вызов mqttc.publish() отправит только первый пакет, а l oop необходим для отправки. остальная полезная нагрузка.

Есть 2 способа запустить сетевые задачи.

  1. Как вы обнаружили, вы можете запустить отдельный поток с помощью mqttc.loop_start()
  2. Другой вариант - позвонить mqttc.loop() внутри себя, а l oop
...