Как реализовать и выполнить потоки с несколькими классами в Python?
Я очень новичок в Python (большая часть моего предыдущего опыта программирования была на промежуточном C++ и Java) и пытаюсь разработать сценарий, который будет считывать данные датчиков и записывать их в файл.csv. Для этого я создал отдельные классы для кода - один будет считывать данные датчика и выводить их на консоль, в то время как другой должен принимать эти данные и регистрировать их - и объединил их вместе в главный скрипт, содержащий каждый класс.. По отдельности они работают отлично, но вместе работают только функции класса sensorReader. Я пытаюсь заставить каждый класс работать в своем собственном потоке, одновременно передавая данные датчика из первого класса (sensorReader) во второй класс (csvWriter). Я разместил несколько своих псевдокодов ниже, но при необходимости я буду рад прояснить любые вопросы с фактическим исходным кодом.
import time
import sensorStuff
import csv
import threading
import datetime
class sensorReader:
# Initializers for the sensors.
this.code(initializes the sensors)
while True:
try:
this.code(prints the sensor data to the console)
this.code(throws exceptions)
this.code(waits 60 seconds)
class csvWriter:
this.code(fetches the date and time)
this.code(writes the headers for the excel sheet once)
while True:
this.code(gets date and time)
this.code(writes the time and one row of data to excel)
this.code(writes a message to console then repeats every minute)
r = sensorReader()
t = threading.Thread(target = r, name = "Thread #1")
t.start()
t.join
w = csvWriter()
t = threading.Thread(target = w, name = "Thread #2")
t.start()
Я понимаю, что последняя часть на самом деле не имеет смысла, но я действительно пробиваюсь выше своего веса, поэтому я даже не уверен, почему работает только первый класс, а не второй, не говоря уже о том, как реализовать многопоточность для нескольких классов. Я был бы очень признателен, если бы кто-нибудь мог указать мне правильное направление.
Спасибо!
РЕДАКТИРОВАТЬ
Решил выложить полный исходный код:
import time
import board
import busio
import adafruit_dps310
import adafruit_dht
import csv
import threading
import datetime
# import random
class sensorReader:
# Initializers for the sensors.
i2c = busio.I2C(board.SCL, board.SDA)
dps310 = adafruit_dps310.DPS310(i2c)
dhtDevice = adafruit_dht.DHT22(board.D4)
while True:
# Print the values to the console.
try:
global pres
pres = dps310.pressure
print("Pressure = %.2f hPa"%pres)
global temperature_c
temperature_c = dhtDevice.temperature
global temperature_f
temperature_f = temperature_c * (9 / 5) + 32
global humidity
humidity = dhtDevice.humidity
print("Temp: {:.1f} F / {:.1f} C \nHumidity: {}% "
.format(temperature_f, temperature_c, humidity))
print("")
# Errors happen fairly often with DHT sensors, and will occasionally throw exceptions.
except RuntimeError as error:
print("n/a")
print("")
# Waits 60 seconds before repeating.
time.sleep(10)
class csvWriter:
# Fetches the date and time for future file naming and data logging operations.
starttime=time.time()
x = datetime.datetime.now()
# Writes the header for the .csv file once.
with open('Weather Log %s.csv' % x, 'w', newline='') as f:
fieldnames = ['Time', 'Temperature (F)', 'Humidity (%)', 'Pressure (hPa)']
thewriter = csv.DictWriter(f, fieldnames=fieldnames)
thewriter.writeheader()
# Fetches the date and time.
while True:
from datetime import datetime
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
# Writes incoming data to the .csv file.
with open('Weather Log %s.csv', 'a', newline='') as f:
fieldnames = ['TIME', 'TEMP', 'HUMI', 'PRES']
thewriter = csv.DictWriter(f, fieldnames=fieldnames)
thewriter.writerow({'TIME' : current_time, 'TEMP' : temperature_f, 'HUMI' : humidity, 'PRES' : pres})
# Writes a message confirming the data's entry into the log, then sets a 60 second repeat cycle.
print("New entry added.")
time.sleep(10.0 - ((time.time() - starttime) % 10.0)) # Repeat every ten seconds.
r = sensorReader()
t = threading.Thread(target = r, name = "Thread #1")
t.start()
t.join
w = csvWriter()
t = threading.Thread(target = w, name = "Thread #2")
t.start()
1 ответ
Это было бы лучше с такой структурой. Если вы поместите первый цикл в функцию, вы можете отложить его оценку до тех пор, пока не будете готовы запустить поток. Но в теле класса он будет выполняться немедленно, и вы никогда не дойдете до второго определения.
def sensor_reader():
# Initializers for the sensors.
this.code(initializes the sensors)
while True:
try:
this.code(prints the sensor data to the console)
except:
print()
this.code(waits 60 seconds)
threading.Thread(target=sensor_reader, name="Thread #1", daemon=True).start()
this.code(fetches the date and time)
this.code(writes the headers for the excel sheet once)
while True:
this.code(gets date and time)
this.code(writes the time and one row of data to excel)
this.code(writes a message to console then repeats every minute)
Я сделал его демоном, чтобы он останавливался, когда вы завершаете программу. Также обратите внимание, что нам нужно было создать только один поток, поскольку у нас уже есть основной поток.