Ejemplo Python (múltiples conexiones simultáneas)
Para crear un programa en modo remoto que pueda manejar múltiples conexiones simultáneas, cada conexión debe ser manejada independientemente para evitar bloqueos. El framework AE Python realiza esta tarea. Por defecto, el framework AE Python utiliza hilos para gestionar cada petición. Es posible anular esta funcionalidad y hacer que el framework se ejecute con un único hilo o que utilice la bifurcación para gestionar múltiples peticiones simultáneas.
Cuando se llama a run(), la clase llama a getRequestHandlingStyle(). Por defecto busca en la variable de clase, DEFAULT_REQUEST_HANDLING_STYLE. Hay dos formas de sobreescribir la forma en que se ejecuta un AE: se puede sobrecargar la función getRequestHandlingStyle() cuando se desea un comportamiento más intrincado, o se puede sobreescribir la variable de clase DEFAULT_REQUEST_HANDLING_STYLE. El ejemplo mostrado utiliza el método simple para forzar al framework a bifurcarse y mostrar que el manejador interno no está siendo ejecutado en el mismo proceso que el AE remoto en ejecución devolviendo los Ids del proceso actual y del proceso padre.
Este ejemplo utiliza el siguiente nombre de archivo:
fork.py
Código
import nzae
class ForkAe(nzae.Ae):
DEFAULT_REQUEST_HANDLING_STYLE = nzae.Ae.REQUEST_HANDLING_STYLE__FORK
def _getFunctionResult(self, row):
return [parentProcessId, os.getpid()]
parentProcessId = os.getpid()
ForkAe.run()
virtual
Despliegue el script:
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./fork.py --version 3
Registro
Registrar tanto el AE bifurcador como el AE lanzador:
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udtf --exe fork.py --sig "remote_fork(int4)" \
--return "table(parent_id int4, child_id int4)" --remote \
--rname forkRemote
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udtf --exe fork.py --sig "launch_remote_fork(int4)" \
--return "table(aeresult varchar(255))" --remote --launch \
--rname forkRemote
En ejecución
Ejecute el servidor remoto AE:
SELECT * FROM TABLE WITH FINAL(launch_remote_fork(0));
AERESULT
-----------------------------------------------------------------------
tran: 8592 session: 16283 DATA slc: 0 hardware: 0 machine: TT4-R045 process:
32082 thread: 32082
(1 row)
Ahora ejecute la bifurcación AE:
SELECT * FROM TABLE WITH FINAL(remote_fork(0));
PARENT_ID | CHILD_ID
-----------+----------
32082 | 32154
(1 row)
El framework Python realiza la bifurcación. Si la variable DEFAULT_REQUEST_HANDLING_STYLE no estuviera anulada, los números coincidirían, ya que no se ha creado ningún proceso nuevo para gestionar la petición.
Aunque en estos ejemplos la ruta /nz/export está codificada, cuando se crean EAs para liberación, esta ruta debe ser recuperada a través del comando nzenv usando la variable NZ_EXPORT_DIR.