Estoy tratando de crear una construcción en Python 3 que me permita ejecutar fácilmente una función en una máquina remota. Suponiendo que ya tengo un servidor TCP pitón que ejecutará las funciones que recibe, que se ejecuta en el servidor remoto, estoy buscando a utilizar un decorador como¿Cómo copio una función de python a una máquina remota y luego la ejecuto?
@execute_on(address, port)
Esto crearía el contexto necesario requerido para ejecuta la función que está decorando y luego envía la función y el contexto al servidor tcp en la máquina remota, que luego la ejecuta. En primer lugar, ¿es esto algo sensato? Y si no, ¿podrías recomendar un mejor enfoque? He hecho algunas búsquedas en Google, pero no he encontrado nada que satisfaga estas necesidades.
Tengo una implementación rápida y sucia para el servidor tcp y el cliente, así que estoy bastante seguro de que funcionará. Puedo conseguir una representación de cadena de la función (por ejemplo func) ser pasado al decorador por
import inspect
string = inspect.getsource(func)
que luego puede ser enviada al servidor donde puede ser ejecutado. El problema es, ¿cómo obtengo toda la información de contexto que la función requiere para ejecutar? Por ejemplo, si se define de la siguiente manera func,
import MyModule
def func():
result = MyModule.my_func()
MyModule tendrá que estar disponible para func ya sea en el contexto o funcs contexto local en el servidor remoto global. En este caso, es relativamente trivial, pero puede ser mucho más complicado dependiendo de cuándo y cómo se usan las declaraciones de importación. ¿Hay alguna manera fácil y elegante de hacer esto en Python? Lo mejor que he encontrado en este momento es usar la biblioteca ast para extraer todas las declaraciones de importación, utilizando el módulo de inspección para obtener representaciones de cadenas de esos módulos y luego reconstruir todo el contexto en el servidor remoto. No particularmente elegante y puedo ver mucho espacio para el error.
Gracias por su tiempo
+1 para execnet. Lo he usado para ejecutar algunos casos de prueba de forma distribuida y funciona muy bien. –