Source code for thermostat.multiple
from multiprocessing import Pool
def _calc_epa_func(thermostat):
""" Takes an individual thermostat and runs the
calculate_epa_field_savings_metrics method. This method is necessary for
the multiprocessing pool as map / imap need a function to run on.
Parameters
----------
thermostat : thermostat
Returns
-------
results : results from running calculate_epa_field_savings_metrics
"""
results = thermostat.calculate_epa_field_savings_metrics()
return results
[docs]def multiple_thermostat_calculate_epa_field_savings_metrics(thermostats):
""" Takes a list of thermostats and uses Python's Multiprocessing module to
run as many processes in parallel as the system will allow.
Parameters
----------
thermostats : thermostats iterator
A list of the thermostats run the calculate_epa_field_savings_metrics
upon.
Returns
-------
metrics : list
Returns a list of the metrics calculated for the thermostats
"""
# Convert the thermostats iterator to a list
thermostats_list = list(thermostats)
pool = Pool()
results = pool.imap(_calc_epa_func, thermostats_list)
pool.close()
pool.join()
metrics_dict = {}
for output in results:
thermostat_id = output[0]['ct_identifier']
metrics_dict[thermostat_id] = []
for individual_output in output:
metrics_dict[thermostat_id].append(individual_output)
# Get the order of the thermostats from the original input so the output
# matches the order that was sent in
thermostat_ids = \
[thermostat.thermostat_id for thermostat in thermostats_list]
metrics = []
for thermostat_id in thermostat_ids:
try:
for metric in metrics_dict[thermostat_id]:
metrics.append(metric)
# Prevent duplicate thermostat IDs from being double-counted
metrics_dict.pop(thermostat_id, None)
# Trap for missing keys
except KeyError:
pass
return metrics