Код: Выделить всё
with WorkerContext():
worker = Worker()
thread = Thread()
thread.bind(worker)
thread.start()
# Worker class' run method
class Worker:
def run(self):
# Should this code be inside WorkerContext?
Однако в соответствии с контекстом Python семантики менеджера, после вызова __exit__() считается, что менеджер контекста завершил работу, и, как правило, экземпляр больше не является действительным. Мой вопрос: должен ли я намеренно нарушать семантику контекстного менеджера Python, чтобы экземпляр контекста оставался доступным после __exit__()?
Был бы этот дизайн разумным или он мог бы ввести потенциальные проблемы?
Код: Выделить всё
class AbstractContext(ABC):
"""
Base class for context managers.
Notes:
TODO: Support cross-process usage.
TODO: Support cross-machine usage.
TODO: Support cross-cluster usage.
"""
_global_stack = []
_lock = threading.Lock()
@classmethod
def instance(cls: type[T]) -> Optional[T]:
with cls._lock:
if not cls._global_stack:
return None
return next((ctx for ctx in reversed(cls._global_stack) if isinstance(ctx, cls)), None)
@classmethod
def stack(cls: type[T]) -> List[T]:
with cls._lock:
return [ctx for ctx in cls._global_stack if isinstance(ctx, cls)]
Когда я запускаю поток в WorkContext и выполняю его, я, естественно, думаю, что он выполняется в WorkContext, который является статическим.
Но на самом деле , он просто запускает поток, а затем завершает его, при этом внутренняя работа потока на самом деле не выполняется здесь, как мы могли бы себе представить. Я действительно не знаю, как здесь спроектировать его поведение.
Примечание: я не ищу конкретного решения, а скорее хочу понять, что представляет собой элегантный подход.
Подробнее здесь: https://stackoverflow.com/questions/790 ... n-mental-m