Python — Поток скопировал дубликат

#python #multithreading #raspberry-pi #python-multithreading

#python #многопоточность #raspberry-pi #python-многопоточность

Вопрос:

Я пытаюсь выполнить многопоточность в моем приложении на Python. У меня есть основной поток, который создает вложенные потоки. Однако для тестирования я использую только 1 поток. Задача, которую должен выполнять поток, — собирать данные и затем сохранять их в БД. Но я вижу, что он сохраняет его дважды, после отладки я обнаружил, что получаю 2 потока вместо 1.

основная программа :

 
app = webApp.app

def main_program():
    sleep(3)
    while True:
        Sensor.sensors.items()


def start_webApp():
    bottle.run(app=app, host='0.0.0.0', port=8080, reloader=True, debug=True)


if __name__ == '__main__':
    app_thread = threading.Thread(target=start_webApp).start()
    s1_thread = threading.Thread(target=sensor_thread.start_sensor_reading, args=(14, SL.bedroom_1,), name="Sensor_1")
    s1_thread.start()
    main_program()
  

файл потока

 def start_sensor_reading(sensor_pin, sensor_location):
    sleep(3)
    global sensor, current, pulses, sensor_status
    sensor = DigitalInputDevice(sensor_pin)
    current = WFS.isIdle
    pulses = 0
    valve_open_time = 0
    valve_close_time = 0
    Sensor.sensors[sensor_location] = False
    doc_ref = db.collection(sensor_location.value).document()
    while True:
        if current == WFS.isIdle:
            print("idle")
        if sensor.value == 1:
            print("S IS OPENED")
            current = WFS.isOpened
            if pulses == 0:
                valve_open_time = datetime.datetime.now()
        if current == WFS.isOpened:
            m, s = get_time_diff(valve_open_time)
            if s > 30:
                Sensor.sensors[sensor_location] = True
            while sensor.value == 1:
                print("S IS OPENED - Counting pulses")
                pulses  = sensor.value
            current = WFS.isNoisy
        if current == WFS.isNoisy:
            print("S IN NOISE")
            valve_close_time = datetime.datetime.now()
            while sensor.value == 0:
                print("S IN NOISE - checking if will close")
                minutes, seconds = get_time_diff(valve_close_time)
                if seconds > 3:
                    current = WFS.isClosed
                    break
        if current == WFS.isClosed:
            current = WFS.isIdle
            sleep(10) <<< HERE IS THE PROBLEM - I do sleep 10 secs to see how many times it prints <<<<<<
            print("S IS CLOSED - SAVING IN DB - SENSOR PIN : "   str(sensor_pin))
            sleep(10)
            m, s = get_time_diff(valve_open_time)
            duration = str(m)   ":"   str(s)
            liters = pulses / 450
            doc_ref.set({
                'Liters': liters,
                'Started_At': valve_open_time,
                'Stopped_At': valve_close_time,
                'Duration': duration
            })
            pulses = 0
  

вывод на консоль

 S IN NOISE - checking if will close
S IN NOISE - checking if will close
S IS CLOSED - SAVING IN DB - SENSOR PIN : 14
S IS CLOSED - SAVING IN DB - SENSOR PIN : 14
idle
idle
idle
idle
  

Как вы можете видеть, я должен получить ЗАКРЫТО печатается один раз, но появляется дважды

С уважением

Комментарии:

1. В качестве app_thread = threading.Thread(target=start_webApp).start() отступа — start() возвращает None , а не поток. Если вы хотите сохранить ссылку на поток, вам необходимо app_thread = threading.Thread(target=start_webApp);app_thread.start() .

2. спасибо за ваш комментарий, буду иметь это в виду

3. current инициализируется WFS.isIdle , и первая ветвь if проверяет это, поэтому первая строка вывода должна быть idle … пожалуйста, опубликуйте полный исполняемый код.

4. вы правы, первая строка вывода должна быть простой, но я делаю ее короткой. потому что я не могу вставить все строки ввода

Ответ №1:

Я обнаружил, что это был поток flask, связанный с обработкой потоков, поэтому я удалил его, после чего все работало нормально.