El método remote_exec() de la puerta de enlace toma un solo argumento que puede ser uno de los siguientes tres tipos:
- Una string de código para ejecutar de forma remota
- El nombre de una función pura que se serializará y ejecutará de forma remota
- El nombre de un módulo puro cuya fuente se ejecutará de forma remota.
Código: Usando el módulo remote_tag.py con tres opciones
import pickle if __name__ == '__channelexec__': tagger = pickle.loads(channel.receive()) for sentence in channel: channel.send(tagger.tag(sentence))
¿Qué es Módulo Puro?
- Un módulo puro es un módulo autónomo: solo puede acceder a los módulos de Python que están disponibles donde se ejecuta y no tiene acceso a ninguna variable o estado que exista donde se crea inicialmente la puerta de enlace.
- De manera similar, una función pura es una función autónoma, sin dependencias externas.
- Para detectar que el módulo está siendo ejecutado por execnet, verifique la variable __name__ . Si es igual a ‘__channelexec__’ , entonces se está utilizando para crear un canal remoto.
- Esto es similar a hacer if __name__ == ‘__main__’ para verificar si un módulo se está ejecutando en la
línea de comando. - Lo primero que debe hacer es llamar a channel.receive() para obtener el etiquetador serializado, que se carga mediante pickle.loads()
- Se nota que el canal no se importa en ninguna parte, eso se debe a que está incluido en el espacio de nombres global del módulo. Cualquier módulo que execnet ejecuta de forma remota tiene acceso a la variable del canal para comunicarse con el creador del canal.
- Después de tener el etiquetador, etiqueta() cada oración tokenizada de forma iterativa, que se recibe del canal.
- Esto le permite al usuario etiquetar tantas oraciones como el remitente quiera enviar, ya que la iteración no se detendrá hasta que se cierre el canal.
- Por lo tanto, se crea un Node de cómputo para el etiquetado de partes del discurso que dedica el 100 % de sus recursos a etiquetar las oraciones que recibe. Mientras el canal permanezca abierto, el Node estará disponible para su procesamiento.
Execnet puede hacer mucho más, como abrir múltiples canales para aumentar el procesamiento paralelo, así como abrir puertas de enlace a hosts remotos a través de SSH para realizar procesamiento distribuido.
Creación de múltiples canales
Se crean múltiples canales, uno por puerta de enlace, para que el procesamiento sea más paralelo. Cada puerta de enlace crea un nuevo subproceso (o intérprete remoto si se usa una puerta de enlace SSH) y se utiliza un canal por puerta de enlace para la comunicación. Una vez que se crean dos canales, se pueden combinar mediante la clase MultiChannel, que permite al usuario iterar sobre los canales y crear una cola de recepción para recibir mensajes de cada canal.
Después de crear cada canal y enviar el etiquetador, los canales pasan por un ciclo para enviar un número par de frases a cada canal para su etiquetado. Luego, todas las respuestas se recopilan de la cola. Una llamada a queue.get()devolverá una tupla de 2 de (canal, mensaje) en caso de que se requiera saber de qué canal proviene el mensaje. Una vez que se han recopilado todas las oraciones etiquetadas, las puertas de enlace se pueden salir fácilmente.
Código:
import itertools gw1 = execnet.makegateway() gw2 = execnet.makegateway() ch1 = gw1.remote_exec(remote_tag) ch1.send(pickled_tagger) ch2 = gw2.remote_exec(remote_tag) ch2.send(pickled_tagger) mch = execnet.MultiChannel([ch1, ch2]) queue = mch.make_receive_queue() channels = itertools.cycle(mch) for sentence in treebank.sents()[:4]: channel = next(channels) channel.send(sentence) tagged_sentences = [] for i in range(4): channel, tagged_sentence = queue.get() tagged_sentences.append(tagged_sentence) print ("Length : ", len(tagged_sentences)) gw1.exit() gw2.exit()
Producción :
Length : 4
En el código de ejemplo, solo se envían cuatro oraciones, pero en la vida real, se deben enviar miles. Una sola computadora puede etiquetar cuatro oraciones muy rápidamente, pero cuando es necesario etiquetar miles o cientos de miles de oraciones, enviar oraciones a varias computadoras puede ser mucho más rápido que esperar que una sola computadora lo haga todo.
Publicación traducida automáticamente
Artículo escrito por mathemagic y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA