Как реализации Python обрабатывают обмен контекста во время вызовов функций?
Я пытаюсь создать в Python сильно модульную и управляемую данными программу, и мне хотелось бы, чтобы вызовы между модулями проходили через центральный прокси-синглтон, а не каждый объект, содержащий ссылки на объекты, с которыми они общаются. Основная причина этого заключается в том, что я не хочу, чтобы объекты имели какую-либо информацию о том, как работают другие модули, если они переключаются во время выполнения.
В настоящее время этот прокси-сервис представляет собой простой объект, содержащий список кортежей с именами функций и ссылку на объект, которому он принадлежит. Каждый раз, когда модуль сталкивается с командой, которая не является частью его собственных методов, по умолчанию он отправляет ее в эту прокси-службу, которая проверяет, есть ли кто-нибудь в сети, способный выполнить ее. Если он находит кого-то, прокси-сервер перенаправляет вызов функции нужному объекту, а затем отправляет возврат вызывающей стороне, как только он его получает.
Проблема, с которой я сталкиваюсь в этом, заключается в том, что каждый раз, когда мне нужно выполнить какое-либо межпроцессное взаимодействие, я вызываю контекстный обмен на объект, который в конечном итоге раздувает мой стек вызовов без необходимости.
Мой вопрос тогда такой:
Как изменения контекста, такие как это, обрабатываются в реализациях Python? И какую оптимизацию я могу сделать, чтобы снизить влияние таких изменений контекста?
PS: имя прокси может вводить в заблуждение, но это не сетевое приложение. Все это выполняется в одном процессе на одной машине.
Редактировать: как здесь просят, это более конкретный пример.
class forwardToProxy:
dict = {} #this dictionary would contain the names of commands such as "deleteName"
#and a first class function bound to the part of the program currently
#responsible for executing that command.
def forward_command(command, arg):
return dispatch[command](arg)
Это один из примеров того, что я имел в виду для прокси-объекта. Единственное, что делает этот класс - это перенаправляет команды в те части программы, которые в данный момент назначены для выполнения. Мой вопрос касается последствий использования такого рода структуры.
Создает ли каждый вызов модуля создание нового экземпляра этого класса в памяти, пока он не разрешится?
Если бы команда была перенаправлена в модуль, который, следовательно, переадресовал бы другую команду и заставил бы другой модуль переслать еще одну команду, сколько экземпляров этого объекта будет ожидать в памяти возможного возврата?
Что именно происходит в памяти каждый раз, когда мы выполняем вызов функции в различных реализациях Python?(Пожалуйста, объясните как для одного и того же модуля, так и для вызовов внешнего модуля)
Какие оптимизации можно использовать для уменьшения влияния таких изменений контекста (поможет ли, например, @staticmethod)?
1 ответ
Интересная тема. Честно говоря, Python вряд ли будет работать быстро, однако я наблюдаю все больший спрос на это.
Короче:
Область действия функции dict
И не вижу много, чтобы оптимизировать здесь.
Немного более длинное объяснение:
Я знаю, что именованный кортеж используется, когда в игру вступают оптимизации пространства. Причина заключается в том, что с именованным кортежем все ключи одинаковы и сохраняются один раз. Таким образом, вы можете сэкономить место в определении прокси. Однако, если вы вызываете функцию, она создает область видимости, которая dict
, Вот как работает Python. Как это оптимизировать? Ну, вы должны написать это в C, чтобы иметь полный контроль над тем, что и когда выделяется.