4D v16.3

Procesos 4D apropiativos

Inicio

 
4D v16.3
Procesos 4D apropiativos

Procesos 4D apropiativos  


 

 

4D Developer Edition 64 bits para OS X ( así como para Windows a partir de 4D v16 R2) ofrecen una poderosa funcionalidad: la posibilidad de ejecutar código 4D en un proceso apropiativo. Gracias a esta nueva funcionalidad, sus aplicaciones 4D compiladas podrán sacar el máximo provecho de los ordenadores de varios núcleos de modo que su ejecución será más rápida y puede soportar más usuarios conectados.

Cuando se ejecuta en modo apropiativo, un proceso está dedicado a una CPU. La gestión de procesos luego se delega al sistema, que puede adjudicar por separado cada CPU en una máquina multi-núcleo.

Cuando se ejecuta en modo cooperativo (el único modo disponible en 4D hasta 4D v15 R5), todos los procesos son gestionados por el hilo de la aplicación padre y comparten la misma CPU, incluso en una máquina multi-núcleo.

Como resultado, en el modo apropiativo, el rendimiento global de la aplicación se incrementa, sobre todo en máquinas multi-núcleo, ya que múltiples procesos (hilos) se pueden ejecutar simultáneamente. Sin embargo, las ganancias reales dependen de las operaciones ejecutadas.

En contraparte, ya que en el modo apropiativo cada hilo es independiente de los demás y no es gestionado directamente por la aplicación, limitaciones específicas se aplican a los métodos que usted desea que sean compatibles con el modo apropiativo. Además, la ejecución apropiativa está disponible sólo en algunos contextos específicos.

El uso del modo apropiativo está disponible versiones 4D 64 bits únicamente. Los siguientes contextos de ejecución son actualmente soportados:

Ejecución apropiativa
4D ServerX
4D remoto-
4D mono usuarioX
Modo compiladoX
Modo interpretado-

Si el contexto de ejecución soporta el modo apropiativo y si el método es "hilo de seguro", un proceso 4D lanzado utilizando los comandos New process o CALL WORKER, o vía el comando de menú "Ejecutar método" se ejecutará en modo apropiativo.

De lo contrario, si llama New process o CALL WORKER desde un contexto de ejecución que no es soportado (por ejemplo en una máquina 4D remota), el proceso es siempre cooperativo.

Nota: puede ejecutar un proceso en modo apropiativo desde un 4D remoto iniciando un procedimiento almacenado en el servidor con el lenguaje, por ejemplo, con Execute on server.

El código 4D se puede ejecutar en hilo apropiativo sólo cuando se cumplen algunas condiciones específicas. Cada parte del código ejecutado (comandos, métodos, variables...) debe ser compatible con una ejecución apropiativa. Los elementos que se pueden ejecutar en hilos apropiativos se llaman hilos seguros y los elementos que no se pueden ejecutar en hilos apropiativos se llaman hilos inseguros.

Nota: dado que un hilo se maneja de forma independiente a partir del método proceso padre, toda la cadena de llamadas no debe incluir ningún código hilo inseguro, de lo contrario la ejecución apropiativa no será posible. Este punto se discute en el párrafo ¿Cuando un proceso se inicia apropiativamente?.

La propiedad "seguridad de hilo" de cada elemento depende del elemento en sí:

  • Comandos 4D:  hilo seguro es una propiedad interna. En la referencia del lenguaje, los comandos hilo seguro se identifican por la imagen . Una gran parte de los comandos 4D pueden ejecutarse en modo apropiativo.
  • Métodos de proyecto: las condiciones para seguridad de hilo se listan en el párrafo Escribir un método hilo seguro.

Básicamente, el código que se ejecuta en hilos apropiativos no puede llamar a las partes con las interacciones externas, tal como el código plug-in o las variables interproceso. Los accesos a los datos, sin embargo, son permitidos desde el servidor de datos 4D que soporta la ejecución apropiativa.

Por defecto, 4D ejecuta todos los métodos de proyecto de su aplicación en modo cooperativo. Si desea beneficiarse de la funcionalidad modo apropiativo, el primer paso consiste en declarar explícitamente todos los métodos que  desea que se inicien en modo apropiativo siempre que sea posible, es decir, los métodos que considere capaz de ejecutar en proceso apropiativo. El compilador comprobará que estos métodos sean en realidad hilo seguro (ver Escribir un método hilo seguro para más información). También puede inhabilitar el modo apropiativo para algunos métodos, si es necesario.

Tenga en cuenta que la definir un método como apropiativo hace que sea elegible para ejecución apropiativa, pero no garantiza que se ejecute realmente en modo apropiativo. Iniciar un proceso en modo apropiativo resulta de una evaluación realizada por 4D respecto a las propiedades de todos los métodos en la cadena de llamadas del proceso (para más información, consulte el párrafo ¿Cuando un proceso se inicia apropiativamente?.

Para declarar su método de elegibilidad para el modo apropiativo, es necesario utilizar la opción de declaración Modo de ejecución en el cuadro de diálogo Propiedades del método:

 

Están disponibles las siguientes opciones:

  • Puede ejecutarse en un proceso apropiativo: al seleccionar esta opción, declara que el método es capaz de ejecutarse en un proceso apropiativo y por lo tanto se debe ejecutar en modo apropiativo cuando sea posible. La propiedad "apropiativa" del método se activa.
    Cuando se selecciona esta opción, el compilador 4D verificará que el método esté realmente activo y devolverá error si no es el caso, por ejemplo, si directa o indirectamente llama a comandos o métodos que no se pueden ejecutar en modo apropiativo (toda la cadena de llamadas se analiza, pero sólo los errores son reportados al primer subnivel). Luego, puede editar el método para que sea hilo seguro o seleccionar otra opción.
    Si la elegibilidad del método al modo apropiativo es aprobada, se etiqueta "hilo-seguro" internamente y se ejecutará en el modo apropiativo siempre que se cumplan las condiciones requeridas. Esta propiedad define su elegibilidad para el modo apropiativo, pero no garantiza que el método realmente se puede ejecutar en modo apropiativo, ya que este modo de ejecución requiere un contexto específico (ver ¿Cuando un proceso se inicia apropiativamente?).
  • No se puede ejecutar en un proceso apropiativo: seleccionando esta opción, se declara que el método no debe ejecutarse en modo apropiativo, y por lo tanto siempre se debe ejecutar en modo cooperativo, al igual que en las versiones anteriores de 4D. La propiedad "apropiativa" del método se activa.
    Cuando se selecciona esta opción, el compilador 4D no verificará la capacidad del método para ejecutarse de forma apropiativa; se marca de forma automática "hilo-inseguro" internamente (incluso si es teóricamente compatible). Cuando se llama en ejecución, este método "contamina" cualquier otro método en el mismo hilo, lo que obliga a este hilo a ser ejecutado en modo cooperativo, incluso si los otros métodos son hilo seguro.
  • Indiferente (por defecto): al seleccionar esta opción, usted declara que no desea manejar la propiedad apropiativa para el método. La propiedad "apropiativa" del método se establece como "indiferente".
    Cuando se selecciona esta opción, el compilador 4D evaluará la capacidad apropiativa del método y la etiquetará internamente como "hilo seguro " o "hilo inseguro". No se devuelve ningún error relacionado con la ejecución apropiativa. Si se evalúa el método como hilo seguro, la ejecución no impedirá la utilización del modo apropiatvo si se llama en un contexto apropiativo. Por el contrario, si el método se evalúa "hilo inseguro", durante la ejecución se evitará cualquier utilización del modo apropiativo cuando se le llame.
    Tenga en cuenta que con esta opción, cualquiera que sea la evaluación interna de seguridad de hilo, siempre se ejecutará el método en modo cooperativo cuando sea llamado directamente por 4D como el primer método array (por ejemplo a través del comando New process). Si se ha etiquetado como "hilo seguro" internamente, sólo se tendrá en cuenta cuando se llama desde otros métodos dentro de una cadena de llamadas.
 

Nota: un método de componentes declarados como "Compartido con componentes y bases locales" también debe ser declarado "capaz" con el fin de que pueda correr en un hilo apropiativo por la base local.

Al exportar el código del método utilizando, por ejemplo METHOD GET CODE, la propiedad "apropiativa" se exporta en el comentario atributo con valor "auto", "seguro", o "inseguro". Los comandos METHOD GET ATTRIBUTES y METHOD SET ATTRIBUTES también obtienen o establecen el atributo "apropiativo" con valor "auto", "seguro", o "inseguro".

La siguiente tabla resume los efectos de las opciones de declaración del modo apropiativo:

OpciónValor de la propiedad apropiativa (interpretado)Acción compiladorEtiqueta interna (compilada)Modo de ejecución, si la cadena de llamadas es hilo seguro
Se puede ejecutar en procesos apropiativoscapazComprobar la capacidad y devuelve errores si fuera incapazHilo seguroApropiativo
No se puede ejecutar en los procesos apropiativosincapazSin evaluaciónHilo inseguroCooperativo
IndiferenteindiferenteEvaluación, pero no hay errores devueltoshilo de seguridad o hilo inseguroSi hilo seguro: apropiativo; Si hilo inseguro: cooperativo; si es llamado directamente: cooperativo

Recordatorio: la ejecución apropiativa sólo está disponible en modo compilado.

En modo compilado, cuando se inicia un proceso creado por los métodos New process o CALL WORKER, 4D lee la propiedad apropiativa del método proceso (también llamado método padre) y ejecuta el proceso en modo apropiativo o cooperativo, en función de esta propiedad:

  • Si el método proceso es hilo seguro (validado durante la compilación), el proceso se ejecuta en un hilo apropiativo.
  • Si el método proceso hilo inseguro, el proceso se ejecuta en un hilo cooperativo.
  • Si la propiedad apropiativa del método de proceso era "indiferente", por compatibilidad el proceso se ejecuta en un hilo cooperativo (incluso si el método es realmente capaz). Note sin embargo que esta funcionalidad de compatibilidad se aplica sólo cuando se utiliza el método como método de proceso: un método declarado "indiferente", pero internamente etiquetado "hilo seguro" por el compilador se puede llamar de forma apropiativa por otro método (ver abajo).

La propiedad seguridad de hilo depende de la cadena de llamadas. Si un método con la propiedad declarada "capaz" llama a un método hilo inseguro en cualquiera de sus subniveles, se devolverá un error de compilación: si un método único en toda la cadena de llamadas es hilo inseguro, "contaminará" todos los otros métodos y la ejecución apropiativa será rechazada por el compilador. Un hilo apropiativo sólo puede crearse cuando toda la cadena es hilo seguro y el método de proceso ha sido declarado "Se puede ejecutar en proceso apropiativo".
Por otra parte, un mismo método hilo seguro puede ejecutarse en un hilo apropiativo en una cadena de llamada y en hilo cooperativo en otra cadena de llamada.

Por ejemplo, considere los siguientes métodos de proyecto:

  //Método proyecto MyDialog
  //contiene llamadas de interfaz: será hilo no seguro internamente
 $win:=Open window("tools";Palette form window)
 DIALOG("tools")

  //Método proyecto MyComp
  //contiene calculo simple: será hilo seguro internamente
 C_LONGINT($1)
 $0:=$1*2

  //Método proyecto CallDial
 C_TEXT($vName)
 MyDialog

  //Método proyecto CallComp
 C_LONGINT($vAge)
 MyCom($vAge)

La ejecución de un método en el modo apropiativo dependerá de que la propiedad "ejecución" y de la cadena de llamadas. La siguiente tabla ilustra estas diversas situaciones:

Declaración y cadena de llamadasCompilaciónSeguridad de hilo resultanteComentarioEjecución

OKMétodo A es el método padre, declarado "capaz" de uso apropiativo; ya que el método B es internamente hilo seguro, el método A es hilo seguro y el proceso es apropiativoApropiativo
ErrorEl método C es el método padre, declarado "capaz"; sin embargo, ya que el método E está internamente hilo inseguro, contamina la cadena de llamadas. La compilación falla debido a un conflicto entre la declaración del método C y la capacidad realLa solución es o bien modificar el método E para que sea hilo seguro (suponiendo que el método D es hilo seguro), de modo que la ejecución es apropiativa, o para cambiar la declaración de propiedad del método C  a cooperativo
OKComo el método F se declara "incapaz" de uso apropiativo, la compilación es internamente hilo inseguro, la ejecución siempre será cooperativa, cualquiera que sea el estado del método GCooperativo
OKDesde que el método H es el método padre (la propiedad era "indiferente") , el proceso es cooperativo. La compilación es exitosa, incluso  si el método fue declarado "capaz"Cooperativo
OKel método J es el método padre (propiedad "indiferente"), entonces el proceso es cooperativo, incluso si toda la cadena es hilo seguroCooperativo

4D le permite identificar la ejecución de procesos en modo compilado:

  • El comando PROCESS PROPERTIES le permite averiguar si un proceso se ejecuta en modo apropiativo o cooperativo.
  • El Explorador de ejecución y la ventana de administración de 4D Server muestran nuevos iconos específicos para los procesos apropiativos (así como también para procesos worker):
    Tipo de procesoIcono
    Proceso almacenado apropiativo
    Proceso worker apropiativo
    Proceso worker cooperativo

Para ser hilo seguro, un método debe respetar las siguientes reglas:

  • debe tener la propiedad "Se puede ejecutar en procesos apropiativos" o "Indiferente"
  • no llama a un comando 4D que es hilo inseguro.
  • no llama a otro método de proyecto que es hilo inseguro
  • no llama a un plug-in
  • no utiliza bloques de código begin sql/end sql
  • no utiliza ninguna variable interprocesos(*)
  • no llama a objetos de interfaz(**) (hay excepciones, sin embargo, ver más adelante).

Nota: en el caso de un método "Compartido por componentes y bases locales", la propiedad "Se puede ejecutar en procesos apropiativos" debe ser seleccionada.

(*) Los procesos worker, permiten el intercambio de datos entre todos los procesos, incluyendo los procesos apropiativos. Para más información, consulte el Sobre workers.
(**) El comando ClientComment ofrece una solución elegante para llamar a objetos de interfaz de un proceso apropiativo.

Los métodos con la propiedad "Se puede ejecutar en procesos apropiativos" serán verificados por 4D en el paso de compilación. Un error de compilación se emite cuando el compilador encuentra algo que le impide ser hilo seguro:

El archivo de símbolos, si está habilitado, también contiene el estado de hilo de seguridad para cada método:

Ya que son accesos "externos", las llamadas a objetos de interfaz de usuario, tales como formularios, así como también al Depurador no están permitidas en hilos apropiativos.

Los únicos accesos posibles a la interfaz de usuario de un hilo apropiativo son:

  • diálogo de error estándar. El diálogo se muestra en el proceso modo de usuario (en 4D monousuario) o el proceso de interfaz de usuario del servidor (4D Server). El botón Rastreo está inhabilitado.
  • indicadores de progreso estándar
  • Diálogos ALERT, REQUEST y CONFIRM. El diálogo se muestra en el proceso modo usuario (en 4D monousuario) o el proceso de interfaz de usuario del servidor (4D Server).
    Tenga en cuenta que si 4D Server se ha lanzado como un servicio en Windows sin intervención del usuario permitido, no se mostrarán los diálogos.

Un número significativo de comandos 4D son hilo seguro. En la documentación, la imagen en el área de propiedad del comando indica que el comando es hilo seguro. Puede obtener la lista de comandos hilo seguro en el manual Referencia del lenguaje.

También puede utilizar Command name que puede devolver la propiedad hilo seguro para cada comando (ver abajo).

Cuando un método utiliza un comando que puede llamar un disparador, el compilador 4D evalúa la seguridad de hilo del disparador para comprobar la seguridad de hilo del método:

 SAVE RECORD([Table_1]//dispara en Table_1, si existe, debe ser hilo seguro

Esta es la lista de comandos que se verifican en el momento de la compilación para la seguridad de hilo de los disparadores:

  • SAVE RECORD
  • SAVE RELATED ONE
  • DELETE RECORD
  • DELETE SELECTION
  • ARRAY TO SELECTION
  • JSON TO SELECTION
  • APPLY TO SELECTION
  • IMPORT DATA
  • IMPORT DIF
  • IMPORT ODBC
  • IMPORT SYLK
  • IMPORT TEXT

Si la tabla se pasa dinamicamente, el compilador puede algunas veces no encontrar que trigger evaluar. Estos son algunos ejemplos de cada situación:

 DEFAULT TABLE([Table_1])
 SAVE RECORD
 SAVE RECORD($ptrOnTable->)
 SAVE RECORD(Table(myMethodThatReturnsATableNumber())->)

En este caso, todos los triggers son seleccionados.Si se detecta un comando hilo inseguro en al menos un trigger, todo el grupo se rechaza y el método se declara hilo inseguro.

Los métodos de captura de errores instalados por el comando ON ERR CALL deben ser hilo seguro si es probable que sean llamados desde un proceso apropiativo. Con el fin de manejar este caso, el compilador verifica la propiedad de seguridad de hilo de los métodos de proyecto de captura de errores pasados al comando ON ERR CALL durante la compilación y devuelve los errores correspondientes si no cumplen con la ejecución apropiativa..

Tenga en cuenta que esta comprobación sólo es posible cuando el nombre del método se pasa como una constante, y no se calcula, como se muestra a continuación:

 ON ERR CALL("myErrMethod1") //será verificado por el compilador
 ON ERR CALL("myErrMethod"+String($vNum)) //no será verificado por el compilador

Además, a partir de 4D v15 R5, si un método de proyecto de captura de errores no se puede llamar en tiempo de ejecución (luego de un problema de seguridad hilo, o por cualquier razón como "método no encontrado"), se genera el nuevo error -10532 "No se puede llamar al método de proyecto de gestión de errores 'methodName'".

Un proceso puede desreferenciar a un puntero para acceder al valor de otra variable proceso sólo si ambos procesos son cooperativos, de lo contrario 4D generará un error. En un proceso apropiativo, si algún código 4D intenta desreferenciar un puntero a una variable interproceso, 4D generará un error.

Ejemplo con los siguientes métodos:

Method1:

 myVar:=42
 $pid:=New process("Method2";0;"process name";->myVar)

Method2:

 $value:=$1->

Si el proceso que ejecuta Method1 o el proceso que ejecuta Method2 es apropiativo, luego la expresión "$value:=$1->" lanzará un error de ejecución.

El uso de parámetros de tipo DocRef (referencia de documento abierto, utilizado o devuelto por los comandos Open document, Create document, Append document, CLOSE DOCUMENT, RECEIVE PACKET, SEND PACKET) se limita a los siguientes contextos:

  • Cuando se llama desde un proceso apropiativo, una referencia DocRef sólo es utilizable a partir de ese proceso apropiativo.
  • Cuando se llama desde un proceso cooperativo, una referencia DocRef se puede utilizar desde cualquier otro proceso cooperativo.

Para más información sobre la referencia DocRef, consulte la sección DocRef: número de referencia del documento.


   



Ver también 

Command name
Utilizar procesos web apropiativos

 
PROPIEDADES 

Producto: 4D
Tema: Procesos

 
HISTORIA 

Creado por: 4D v15 R5

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)