Я работаю над сеточной системой, в которой есть несколько очень мощных компьютеров. Они могут быть использованы для выполнения функций Python очень быстро. У моих пользователей есть ряд функций python, для расчета которых на рабочих станциях требуется много времени, в идеале они хотели бы иметь возможность вызывать некоторые функции на удаленном мощном сервере, но, похоже, они выполняются локально.
В Python есть старая функция под названием «apply» - в наши дни она в основном бесполезна, так как 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. Они просто хотят написать свою функцию и вызвать ее.
Просто чтобы уточнить, мне не интересно обсуждать, какой тип сетевого протокола может быть использован для реализации связи между клиентом и сервером. Моя проблема заключается в том, как инкапсулировать функцию и ее зависимости в единый объект, который можно сериализовать и выполнять удаленно.
Меня также не интересуют последствия для безопасности запуска произвольного кода на удаленных серверах - давайте просто скажем, что эта система предназначена исключительно для исследований и находится в среде с высокой степенью защиты.