Exemple Python (plusieurs connexions simultanées)

Pour créer un programme en mode distant capable de gérer plusieurs connexions simultanées, chaque connexion doit être gérée de manière indépendante afin d'éviter les blocages. C'est le cadre Python AE qui se charge de cette tâche. Par défaut, le cadre Python AE utilise des threads pour traiter chaque requête. Il est possible d'outrepasser cette fonctionnalité et de faire en sorte que le cadre s'exécute en mode monotâche ou qu'il utilise la technique de la fourche pour gérer plusieurs demandes simultanées.

Lorsque la fonction run() est appelée sur la classe, celle-ci appelle la getRequestHandlingStyle(). Par défaut, elle consulte la variable de classe DEFAULT_REQUEST_HANDLING_STYLE. Il existe deux façons de modifier le mode d'exécution d'un AE : la fonction getRequestHandlingStyle( peut être surchargée lorsqu'un comportement plus complexe est souhaité, ou la variable de classe DEFAULT_REQUEST_HANDLING_STYLE peut être remplacée. L'exemple présenté utilise la méthode simple pour forcer le framework à forker et montrer que le gestionnaire interne n'est pas exécuté dans le même processus que l'AE distant en cours d'exécution en renvoyant l'ID du processus actuel et celui du processus parent.

Cet exemple utilise le nom de fichier suivant :

fork.py

Coder

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()

Déploiement

Déployer le script :

$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
     --template deploy ./fork.py --version 3

Enregistrement

Enregistrer l'AE de bifurcation et l'AE de lancement :

$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 cours d'exécution

Exécutez le serveur AE distant :

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)

Exécutez maintenant l'AE de bifurcation :

SELECT * FROM TABLE WITH FINAL(remote_fork(0));
 PARENT_ID | CHILD_ID
-----------+----------
     32082 |    32154
(1 row)

C'est le cadre Python qui effectue la conversion. Si la variable DEFAULT_REQUEST_HANDLING_STYLE n'était pas remplacée, les chiffres correspondraient, car aucun nouveau processus n'a été créé pour traiter la demande.

Bien que dans ces exemples le chemin /nz/export soit codé en dur, lors de la création d'AE pour la diffusion, ce chemin doit être récupéré par la commande nzenv en utilisant la variable NZ_EXPORT_DIR.