From 5ffd833fdfd2d17de7d6d56711654c710b50e4de Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 14 Apr 2023 15:02:13 -1000 Subject: [PATCH] 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 --- homeassistant/helpers/event.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 1632522c017..b7d02b48bd3 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -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