#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, связанный с обработкой потоков, поэтому я удалил его, после чего все работало нормально.