jrfernandes / ontario_energy_board

Home Assistant component that installs a sensor with the current energy rate for Ontario energy companies
MIT License
46 stars 11 forks source link

Detected blocking call to import_module inside the event loop #52

Open gmlupatelli opened 5 months ago

gmlupatelli commented 5 months ago

Context: I was looking through my logs and found this warning. The custom component is working normaly.

Core: 2024.6.3 Supervisor: 2024.06.0 Operating System: 12.3 Frontend: 20240610.1

Log:

2024-06-17 11:26:05.470 WARNING (MainThread) [homeassistant.util.loop] Detected blocking call to import_module inside the event loop by custom integration 'ontario_energy_board' at custom_components/ontario_energy_board/coordinator.py, line 42: self.ontario_holidays = holidays.Canada(prov="ON", observed=True) (offender: /usr/local/lib/python3.12/site-packages/holidays/registry.py, line 236: self.entity = getattr(importlib.import_module(self.module_name), self.entity_name)), please create a bug report at https://github.com/jrfernandes/ontario_energy_board/issues
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 223, in <module>
    sys.exit(main())
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 209, in main
    exit_code = runner.run(runtime_conf)
  File "/usr/src/homeassistant/homeassistant/runner.py", line 190, in run
    return loop.run_until_complete(setup_and_run_hass(runtime_config))
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 672, in run_until_complete
    self.run_forever()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 639, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 1988, in _run_once
    handle._run()
  File "/usr/local/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/src/homeassistant/homeassistant/setup.py", line 165, in async_setup_component
    result = await _async_setup_component(hass, domain, config)
  File "/usr/src/homeassistant/homeassistant/setup.py", line 447, in _async_setup_component
    await asyncio.gather(
  File "/usr/src/homeassistant/homeassistant/setup.py", line 449, in <genexpr>
    create_eager_task(
  File "/usr/src/homeassistant/homeassistant/util/async_.py", line 37, in create_eager_task
    return Task(coro, loop=loop, name=name, eager_start=True)
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 742, in async_setup_locked
    await self.async_setup(hass, integration=integration)
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 594, in async_setup
    result = await component.async_setup_entry(hass, self)
  File "/config/custom_components/ontario_energy_board/__init__.py", line 22, in async_setup_entry
    coordinator = OntarioEnergyBoardDataUpdateCoordinator(hass)
  File "/config/custom_components/ontario_energy_board/coordinator.py", line 42, in __init__
    self.ontario_holidays = holidays.Canada(prov="ON", observed=True)
```2024-06-17 11:26:05.470 WARNING (MainThread) [homeassistant.util.loop] Detected blocking call to import_module inside the event loop by custom integration 'ontario_energy_board' at custom_components/ontario_energy_board/coordinator.py, line 42: self.ontario_holidays = holidays.Canada(prov="ON", observed=True) (offender: /usr/local/lib/python3.12/site-packages/holidays/registry.py, line 236: self.entity = getattr(importlib.import_module(self.module_name), self.entity_name)), please create a bug report at https://github.com/jrfernandes/ontario_energy_board/issues
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 223, in <module>
    sys.exit(main())
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 209, in main
    exit_code = runner.run(runtime_conf)
  File "/usr/src/homeassistant/homeassistant/runner.py", line 190, in run
    return loop.run_until_complete(setup_and_run_hass(runtime_config))
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 672, in run_until_complete
    self.run_forever()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 639, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 1988, in _run_once
    handle._run()
  File "/usr/local/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/src/homeassistant/homeassistant/setup.py", line 165, in async_setup_component
    result = await _async_setup_component(hass, domain, config)
  File "/usr/src/homeassistant/homeassistant/setup.py", line 447, in _async_setup_component
    await asyncio.gather(
  File "/usr/src/homeassistant/homeassistant/setup.py", line 449, in <genexpr>
    create_eager_task(
  File "/usr/src/homeassistant/homeassistant/util/async_.py", line 37, in create_eager_task
    return Task(coro, loop=loop, name=name, eager_start=True)
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 742, in async_setup_locked
    await self.async_setup(hass, integration=integration)
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 594, in async_setup
    result = await component.async_setup_entry(hass, self)
  File "/config/custom_components/ontario_energy_board/__init__.py", line 22, in async_setup_entry
    coordinator = OntarioEnergyBoardDataUpdateCoordinator(hass)
  File "/config/custom_components/ontario_energy_board/coordinator.py", line 42, in __init__
    self.ontario_holidays = holidays.Canada(prov="ON", observed=True)
scross01 commented 4 months ago

I'm seeing the same warning in my logs. Appears to be caused by the https://github.com/vacanza/python-holidays package using importlib.import_module.

Found this thread with a suggested fix to add a @async_response decoration to the invoking method https://community.home-assistant.io/t/how-to-call-importlib-import-module-in-a-way-that-doesnt-block-the-thread/728021