@classmethod
def get_runner(cls, variant, reuse_last=True, **constructor_kwargs):
    """
        Return runner instance of given variant

        :param variant: implementation variant, ex. 'threaded', 'twisted', 'asyncio', ...
        :param reuse_last: should we return cached last runner of given variant
        :param constructor_kwargs: arguments specific for given variant
        :return: requested runner
        """
    key = variant
    if key not in cls._constructors_registry:
        raise KeyError('No constructor registered for [{}] runner'.format(key))
    if reuse_last and key in cls._runners_cache:
        runner = cls._runners_cache[key]
    else:
        constructor = cls._constructors_registry[key]
        runner = constructor(**constructor_kwargs)
        cls._runners_cache[key] = runner
    return runner
