Как реализовать и выполнить потоки с несколькими классами в 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)

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

Другие вопросы по тегам