### 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
"""Define mode rescheduled sensors."""
        return self.mode == "reschedule"
    @classmethod
    def get_serialized_fields(cls):
        return super().get_serialized_fields() | {"reschedule"}
def poke_mode_only(cls):
    """
    Decorate a subclass of BaseSensorOperator with poke.
    Indicate that instances of this class are only safe to use poke mode.
    Will decorate all methods in the class to assert they did not change
    the mode from 'poke'.
    :param cls: BaseSensor class to enforce methods only use 'poke' mode.
    """
    def decorate(cls_type):
        def mode_getter(_):
            return "poke"
        def mode_setter(_, value):
            if value != "poke":
                raise ValueError("cannot set mode to 'poke'.")
        if not issubclass(cls_type, BaseSensorOperator):
            raise ValueError(
                f"poke_mode_only decorator should only be "
                f"applied to subclasses of BaseSensorOperator,"
                f" got:{cls_type}."
            )
        cls_type.mode = property(mode_getter, mode_setter)
        return cls_type
    return decorate(cls)