Improve performance of tracking time changes (#91433)

* Improve performance of async_track_time_interval

Uses HassJob internally to avoid looking up the function
target type every time it fires

* name
pull/89456/head^2
J. Nick Koston 2023-04-14 15:02:13 -10:00 committed by GitHub
parent 19a6530c3c
commit 5ffd833fdf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 4 deletions

View File

@ -1425,9 +1425,9 @@ def async_track_time_interval(
hass.async_run_hass_job(job, now)
if name:
job_name = f"{name}: track time interval {interval}"
job_name = f"{name}: track time interval {interval} {action}"
else:
job_name = f"track time interval {interval}"
job_name = f"track time interval {interval} {action}"
interval_listener_job = HassJob(
interval_listener, job_name, cancel_on_shutdown=cancel_on_shutdown
@ -1578,23 +1578,30 @@ def async_track_utc_time_change(
).replace(microsecond=microsecond)
time_listener: CALLBACK_TYPE | None = None
pattern_time_change_listener_job: HassJob[[datetime], Any] | None = None
@callback
def pattern_time_change_listener(_: datetime) -> None:
"""Listen for matching time_changed events."""
nonlocal time_listener
nonlocal pattern_time_change_listener_job
now = time_tracker_utcnow()
hass.async_run_hass_job(job, dt_util.as_local(now) if local else now)
assert pattern_time_change_listener_job is not None
time_listener = async_track_point_in_utc_time(
hass,
pattern_time_change_listener,
pattern_time_change_listener_job,
calculate_next(now + timedelta(seconds=1)),
)
pattern_time_change_listener_job = HassJob(
pattern_time_change_listener,
"time change listener {hour}:{minute}:{second} {action}",
)
time_listener = async_track_point_in_utc_time(
hass, pattern_time_change_listener, calculate_next(dt_util.utcnow())
hass, pattern_time_change_listener_job, calculate_next(dt_util.utcnow())
)
@callback