ich habe ein paar (Verständnis-) Fragen zu Coroutines. Die Grundidee dahinter habe ich verstanden (glaube ich...), praktisch habe ich die aber noch nie eingesetzt.
Heute bot sich am die Gelegenheit, diesen Code (der IMHO so wie so nicht sooo toll ist) auf eine Coroutine-basierte Version umzustricken.
Hier mein Code:
Code: Alles auswählen
import csv
from datetime import datetime
from sense_hat import SenseHat
from time import sleep
FILENAME = "tester"
WRITE_FREQUENCY = 3
DELAY=3
TEMP_H=True
TEMP_P=False
HUMIDITY=True
PRESSURE=True
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
next(cr)
return cr
return start
def get_header():
header = []
if TEMP_H:
header.append('temperature_from_humidity')
if TEMP_P:
header.append('temperature_from_pressure')
if HUMIDITY:
header.append('humidity')
if PRESSURE:
header.append('pressure')
header.append('date and time')
return header
def get_sense_data(sense, delay, write_frequency, storage_target):
data=[]
while True:
sense_data = []
if TEMP_H:
sense_data.append(sense.get_temperature_from_humidity())
if TEMP_P:
sense_data.append(sense.get_temperature_from_pressure())
if HUMIDITY:
sense_data.append(sense.get_humidity())
if PRESSURE:
sense_data.append(sense.get_pressure())
sense_data.append(datetime.now())
data.append(sense_data)
print('added data')
if len(data) == write_frequency:
storage_target.send(data)
data = []
sleep(delay)
@coroutine
def save_to_file(writer):
while True:
data_to_save = (yield)
writer.writerows(data_to_save)
print('Wrote data')
def main():
sense = SenseHat()
full_filename = '{}_{}.csv'.format(FILENAME, int(datetime.now().timestamp()))
try:
with open(full_filename, 'w', newline='') as f:
writer = csv.writer(f)
header = get_header()
writer.writerow(header)
saver = save_to_file(writer)
get_sense_data(sense, DELAY, WRITE_FREQUENCY, saver)
except KeyboardInterrupt:
saver.close()
print('Exited programm')
if __name__ == '__main__':
main()
Code: Alles auswählen
class SenseHat:
def get_temperature_from_humidity(self):
return 20.123
def get_temperature_from_pressure(self):
return 15.987
def get_humidity(self):
return 85
def get_pressure(self):
return 1001
Was mir nicht klar ist: macht das Sinn (oder Unsinn?), dass so zu implementieren (das man das auch anders, also ohne Coroutine implementieren kann ist mir klar)? Nebenläufigkeit, also dass das Schreiben in die CSV-Datei non-blocking ist, habe ich so doch auch nicht, oder? Und muss man hier die Coroutine mit `close()` schließen oder ist das im gegebenen Falle gleich?
Gruß, noisefloor