Ejecutar el código de python arbitrario de forma remota, ¿se puede hacer?

Estoy trabajando en un sistema de red que tiene una cantidad de computadoras muy poderosas. Se pueden usar para ejecutar funciones de python muy rápidamente. Mis usuarios tienen una serie de funciones de Python que tardan mucho tiempo en calcular las estaciones de trabajo, idealmente, les gustaría poder llamar a algunas funciones en un servidor remoto potente, pero parece que se ejecutan localmente.

Python tiene una función antigua llamada “aplicar”; en la mayoría de los casos es inútil ahora que Python admite la syntax de llamadas extendidas (por ejemplo, ** argumentos), sin embargo, necesito implementar algo que funcione un poco como este:

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 debería ser una clase que se pueda usar para ejecutar de forma remota algún código arbitrario ( fn podría ser literalmente cualquier cosa) en un servidor remoto. Enviará de vuelta el resultado que rapply función de rapply . El “resultado” debería tener el mismo valor que si hubiera llamado la función localmente.

Ahora, supongamos que fn es una función proporcionada por el usuario. Necesito alguna forma de enviarla por cable al servidor de ejecución. Si pudiera garantizar que fn siempre fue algo simple, podría ser simplemente una cadena que contenga el código fuente de Python … pero, ¿y si no fuera tan simple?

¿Qué pasaría si fn pudiera tener dependencias locales? Podría ser una función simple que usa una clase definida en un módulo diferente. ¿Existe una forma de encapsular fn y todo lo que fn requiere que no sea una biblioteca estándar? Una solución ideal no requeriría que los usuarios de este sistema tengan mucho conocimiento sobre el desarrollo de Python. Simplemente quieren escribir su función y llamarlo.

    Solo para aclarar, no estoy interesado en discutir qué tipo de protocolo de red podría usarse para implementar la comunicación entre el cliente y el servidor. Mi problema es cómo encapsular una función y sus dependencias como un único objeto que se puede serializar y ejecutar de forma remota.

    Tampoco estoy interesado en las implicaciones de seguridad de ejecutar código arbitrario en servidores remotos. Digamos que este sistema está destinado exclusivamente a la investigación y se encuentra dentro de un entorno con gran cantidad de servidores de seguridad.

    Eche un vistazo a PyRO (objetos remotos de Python) Tiene la capacidad de configurar servicios en todas las computadoras en su clúster, e invocarlos directamente, o indirectamente a través de un servidor de nombres y un mecanismo de publicación-suscripción.

    Parece que quieres hacer lo siguiente.

    • Definir un espacio de sistema de archivos compartido.

    • Ponga TODA la fuente de python en este espacio de sistema de archivos compartido.

    • Defina agentes o servidores simples que “ejecutarán” un bloque de código.

    • Su cliente luego contacta al agente (el protocolo REST con métodos POST funciona bien para
      esto) con el bloque de código. El agente guarda el bloque de código y realiza un execfile en ese bloque de código.

    Como todos los agentes comparten un sistema de archivos común, todos tienen la misma estructura de biblioteca de Python.

    Lo hacemos con una simple aplicación WSGI que llamamos “servidor por lotes”. Contamos con el protocolo RESTful para crear y verificar solicitudes remotas.

    Podría usar una solución de agrupamiento preparada como Parallel Python . Puede configurar con relativa facilidad múltiples esclavos remotos y ejecutar código arbitrario en ellos .

    Stackless tenía la capacidad de decapar y deshacer el código de ejecución. Desafortunadamente, la implementación actual no es compatible con esta característica.

    Podría usar una conexión SSH a la PC remota y ejecutar los comandos en la otra máquina directamente. Incluso podrías copiar el código de Python a la máquina y ejecutarlo.

    Sintaxis:

    cat ./test.py | sshpass -p ‘contraseña’ ssh usuario @ remoto-ip “python – script-argumentos-si-cualquiera para el script test.py”

    1) Aquí “test.py” es el script local de python. 2) sshpass utilizado para pasar la contraseña ssh a la conexión ssh