### Overview
Some Executors, currently a subset of the local Executors, run in a single threaded fashion and have certain limitations and requirements, many of which are hardcoded. To add a new single threaded Executor would require changes to core Airflow code.
Note: This coupling often shows up with SQLite compatibility checks since it does not support multiple connections.
### Examples
- **2a**) SQLite check done in configuration.py: https://github.com/apache/airflow/blob/26f94c5370587f73ebd935cecf208c6a36bdf9b6/airflow/configuration.py#L412-L419
- **2b**) When running in standalone mode SQLite compatibility is checked: https://github.com/apache/airflow/blob/26f94c5370587f73ebd935cecf208c6a36bdf9b6/airflow/cli/commands/standalone_command.py#L160-L165
- **2c**) Sensors in `poke` mode can block execution of DAGs when running with single process Executors, currently hardcoded to DebugExecutor (although should also include SequentialExecutor): https://github.com/apache/airflow/blob/27e2101f6ee5567b2843cbccf1dca0b0e7c96186/airflow/sensors/base.py#L243
### Proposal
A static method or attribute on the Executor class which can be checked by core code.

There is a precedent already set with the `supports_ad_hoc_ti_run` attribute, see:
https://github.com/apache/airflow/blob/fb741fd87254e235f99d7d67e558dafad601f253/airflow/executors/kubernetes_executor.py#L435 https://github.com/apache/airflow/blob/26f94c5370587f73ebd935cecf208c6a36bdf9b6/airflow/www/views.py#L1735-L1737
"""Seconds since first attempt"""
        return (pendulum.now("UTC") - self.first_attempt_time).total_seconds()
    def can_try_again(self):
        """
        If there has been at least one try greater than MIN_SECONDS after first attempt,
        then return False.  Otherwise, return True.
        """
        if self.tries_after_min > 0:
            return False
        self.total_tries += 1
        elapsed = self.elapsed
        if elapsed > self.MIN_SECONDS:
            self.tries_after_min += 1
        log.debug("elapsed=%s tries=%s", elapsed, self.total_tries)
        return True
class BaseExecutor(LoggingMixin):
    """
    Class to derive in order to implement concrete executors.
    Such as, Celery, Kubernetes, Local, Sequential and the likes.
    :param parallelism: how many jobs should run at one time. Set to
        ``0`` for infinity.
    """
    supports_ad_hoc_ti_run: bool = False
    supports_pickling: bool = True
    supports_sentry: bool = False
    job_id: None | int | str = None
    callback_sink: BaseCallbackSink | None = None
    is_local: bool = False
    serve_logs: bool = False
    def __init__(self, parallelism: int = PARALLELISM):