Я работаю над сетевой системой, в которой есть несколько очень мощных компьютеров. Их можно использовать для очень быстрого выполнения функций Python. У моих пользователей есть ряд функций Python, которые требуют много времени для расчета на рабочих станциях, в идеале они хотели бы иметь возможность вызывать некоторые функции на удаленном мощном сервере, но они должны работать локально.
В Python есть старая функция под названием «применить» — в наши дни она в основном бесполезна, поскольку python поддерживает синтаксис расширенного вызова (например, ** аргументы), однако мне нужно реализовать что-то, что работает примерно так:
rapply = Rapply( server_hostname ) # Set up a connection
result = rapply( fn, args, kwargs ) # Remotely call the function
assert result == fn( *args, **kwargs ) #Just as a test, verify that it has the expected value.
Rapply должен быть классом, который можно использовать для удаленного выполнения некоторого произвольного кода (fn может быть буквально любым) на удаленном сервере. Он отправит обратно результат, который вернет функция rapply. «Результат» должен иметь то же значение, как если бы я вызвал функцию локально.
Теперь давайте предположим, что fn — это функция, предоставляемая пользователем. Мне нужен какой-то способ отправить ее по сети на исполняющий сервер. Если бы я мог гарантировать, что fn всегда будет чем-то простым, это могла бы быть просто строка, содержащая исходный код Python... но что, если бы это было не так просто?
Что, если fn может иметь локальные зависимости: это может быть простая функция, которая использует класс, определенный в другом модуле, есть ли способ инкапсулировать fn и все, что требуется fn, кроме стандартной библиотеки? Идеальное решение не требует от пользователей этой системы больших знаний о разработке на Python. Они просто хотят написать свою функцию и вызвать ее.
Просто чтобы уточнить, я не заинтересован в обсуждении того, какой сетевой протокол может использоваться для реализации связи между клиентом и сервером. Моя проблема заключается в том, как инкапсулировать функцию и ее зависимости в виде единого объекта, который можно сериализовать и выполнять удаленно.
Меня также не интересуют последствия для безопасности запуска произвольного кода на удаленных серверах — скажем так, эта система предназначена исключительно для исследований и находится в среде с сильным брандмауэром.