Как эффективно реализовать паттерн Observer в Python для системы с частыми обновлениями (алгоритмическая сложность)?Python

Программы на Python
Anonymous
Как эффективно реализовать паттерн Observer в Python для системы с частыми обновлениями (алгоритмическая сложность)?

Сообщение Anonymous »

Я только начинаю изучать архитектурные шаблоны и пытаюсь реализовать Observer на Python. Моя цель — создать систему мониторинга цен, в которой несколько «подписчиков» будут отслеживать изменения от одного «издателя».
Проблема: по мере роста числа подписчиков (более 10 000) производительность метода notify() падает линейно ($O(n)$). Я понимаю, что в Python цикл for по списку объектов является узким местом. Более того, некоторые подписчики могут отказаться от подписки во время процесса уведомления, вызывая ошибки во время итерации.
Исследование: я читал о библиотеках pubsub, но хочу реализовать их самостоятельно, чтобы понять это. Я пробовал использовать set() вместо list() для хранения подписчиков, чтобы ускорить удаление ($O(1)$), но это не решает проблему последовательного уведомления. Я рассматривал возможность использования asyncio, чтобы сделать уведомления неблокирующими.
Вопрос
Существует ли стандартный шаблон или алгоритмический подход в Python, позволяющий изменить рассылку такого рода типов объектов? Стоит ли следить за многопоточностью или есть способ оптимизировать саму структуру данных?
class Subject:
def __init__(self):
self._observers = [] # Список всех подписчиков

def attach(self, observer):
if observer not in self._observers:
self._observers.append(observer)

def detach(self, observer):
self._observers.remove(observer)

def notify(self, data):
# При 100,000 объектов этот цикл становится очень медленным
for observer in self._observers:
observer.update(data)

class PriceObserver:
def update(self, price):
# Имитация какой-то логики
pass

# Тестовый запуск
subject = Subject()
observers = [PriceObserver() for _ in range(10000)]

for obj in observers:
subject.attach(obj)

subject.notify(150.50)

Вернуться в «Python»