Ambito de procesos 3p y variables


([N1] anton) #1

Buen día,

Me surge la siguiente duda, es sabido que cuando se ejecutan procesos y se manejan variables globales y locales, por asi decirlo se “encapsulan” los valores, principalmente de las variables globales en memoria, al ámbito de la máquina donde se está ejecutando un proceso y llamando a dicha variable global en memoria.

La documentación explica que en el caso de los procesos en 3er plano sucede lo mismo, pero en el ámbito del servidor exclusivamente, queda claro que para obtener o enviar valores a los procesos se deben utilizar los manejadores de objeto, hasta aqui sin problema.

Ahora la verdadera duda, ¿Qué sucede si un proceso en 3P es ejecutado o llamado para su ejecución al mismo tiempo desde distintás máquinas cliente?, vamos dos usuarios, haciendo cosas distintas, con registros diferentes, pero ejecutando o al mismo tiempo o en momentos que se traslapen el inicio de la ejecución del segundo usuario o máquina con el que el primer usuario vaya a medias o finalizando dicho proceso.

Me surge este dilema porque no es posible o no tan sencillo “rastrear” este tipo de comportamientos ya sea por debbug o por mensajes, pero he notado fallas o comportamientos raros en el resultado de la información procesada en estas circunstancias, como si se mezclaran datos de variables locales o globales del proceso en 3P al ser ejecutado desde distintos equipos al mismo tiempo o traslapandose parte del tiempo.

Espero haberme explicado.

Me gustaría conocer sus comentarios y experiencias al respecto.

Anton.


([N3] pacosatu) #2

Hola Anton.

Debes tener muy claro que un vClient solo comparte con otros vClient de la red (local o remota) los siguientes datos:

  • Las tablas de la instancia de datos del vServer
  • Las tablas en memoria en 3P de la instancia de datos del vServer
  • Las variables globales en disco
  • Las variables globales en 3P de la instancia de datos del vServer

Por lo tanto tranquilo, tus procesos ejecutados en 3P se ejecutarán de forma aislada para cada vClient y solo existirá colisión multiusuario si haces uso incontrolado de los datos mencionados anteriormente.

Las variables Locales son internas para cada proceso, indepedientemente del plano en que se ejecuten.

Debes revisar en tu aplicación el uso que hagas de las variables globales en 3P.

Algunas técnicas para poder gestionar datos temporales en 3P y multiusuario consisten en usar Variables Globales de tipo Array, de tal manera que cada usuario usa una fila determinada del Array. También puedes usar una tabla en memoria en 3P donde cada usuario o sesión se registra en la tabla para usar una fila determinada.

En cualquier caso, es un tema que debes tener muy bien depurado o la aplicación multiusurio se va al traste.

Saludos
Paco Satué


([N1] anton) #3

Gracias Paco, me a quedado bastante claro el punto, precisamente con el tema de las variables globales en 3P.

Anton.


([N2] basesoft) #4

¿Y si se trata de una tarea del servidor, qué sucede con las variables globales en memoria?


([N3] pacosatu) #5

Hola basesoft.

Haz la prueba:

  • Crea un proceso que incremente una variable Global en Memoria
  • Añade una Tarea en el vServer que ejecute cada 1 minuto ese proceso
  • Desde un formulario y mediante un Timer (30segs) consulta en 3P el valor la variable global
  • Comprueba que el valor leido va cambiando

Los procesos ejecutados como Tareas en el vServer afectan a todos los vClients conectados a la misma instancia. ¿Por qué? Pues porque las Tareas siempre se ejecutan en el servidor, es decir, en 3P desde el punto de vista de los vClients.

Pruébalo
Saludos
Paco Satué


([N2] basesoft) #6

Gracias, Paco, aunque tarde
Lo suponía pero quería una confirmación
Gracias de nuevo