Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com

Inicio

 
4D v20.6
Procesos 4D apropiativos

Procesos 4D apropiativos  


 

 

4D Developer Edition 64 bits para Windows y OS X ofrecen una poderosa funcionalidad: la posibilidad de escribir y ejecutar código 4D 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 soportados:

Ejecución apropiativa
4D ServerX
4D remotoX (con ServerNet únicamente - ver Nueva capa de red ServerNet (compatibilidad))
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 (desde modo interpretado), el proceso es siempre cooperativo.

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.

    Caso particular: si el método también tiene la propiedad Compartido entre componentes y base local (ver Propiedades de los métodos proyecto), al establecer la opción Indiferente se etiquetará automáticamente el método como hilo no seguro. Si desea que un método de componente compartido sea hilo seguro, debe establecer explícitamente la opción Puede ser ejecutado en procesos apropiativos
 

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 ATTRIBUTESMETHOD 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 solo 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 solo 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 solo 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 resultanteEjecuciónComentario
OKApropiativoCallComp es el método padre, declarado "capaz" de uso apropiativo; ya que MyComp es internamente hilo seguro, CallComp es hilo seguro y el proceso es apropiativo
ErrorLa ejecución es imposibleCallDial es el método padre, declarado "capaz"; MyDialog es "indiferente". Sin embargo, ya que MyDialog está internamente hilo inseguro, contamina la cadena de llamadas. La compilación falla debido a un conflicto entre la declaración deCallDial y su capacidad real. La solución es o bien modificar MyDialog para que sea hilo seguro, de modo que la ejecución es apropiativa, o cambiar la declaración de propiedad de CallDial para correrlo como cooperativo.
OKCooperativoComo CallDial se declara "incapaz" de uso apropiativo, la compilación es internamente hilo inseguro, la ejecución siempre será cooperativa, cualquiera que sea el estado de MyDialog.
OKCooperativoComo CallComp es el método padre (la propiedad era "indiferente"), luego el proceso es cooperativo incluso si toda la cadena es hilo seguro.
OKCooperativoComo CallDial es el método padre (propiedad era "indiferente"), entonces el proceso es cooperativo y la compilación exitosa.

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 iconos específicos para los procesos apropiativos (así como también para procesos worker):
    Tipo de procesoIcono
    Proceso almacenado apropiativo
    Proceso worker apropiativo
    Método web apropiativo
    Método SOAP apropiativo

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 llamar a un comando 4D que no es hilo seguro.
  • no llamar a otro método de proyecto que no es hilo seguro
  • no llama a un plug-in que no es hilo seguro
  • no debe utilizar variables interprocesos(*)
  • no debe llamar a objetos de interfaz(**) (hay excepciones, sin embargo, ver abajo).

Notas:

  • En el caso de un método "Compartido por componentes y bases locales", la propiedad "Se puede ejecutar en procesos apropiativos" debe ser seleccionada.
  • Todas las instrucciones SQL son hilo seguro. El código SQL insertado en los bloques Begin SQL/End SQL debe cumplir con las siguientes condiciones:
    • Debe aplicar a 4D Server o a 4D base local (ODBC o bases remotas vía SQL LOGIN son hilo no seguro. Sin embargo, las bases locales utilizadas con USE DATABASE son hilo seguro).
    • Todo trigger llamado por las sentencias SQL debe ser hilo seguro para subprocesos (ver a continuación Triggers).

(*) Para intercambiar datos entre procesos apropiativos (y entre todos los procesos), puede pasar colecciones compartidas u objetos compartidos como parámetros a procesos, y/o usar el catálogo Storage. Para obtener más información, consulte la página Objetos y colecciones compartidos.
Los procesos worker también le permiten intercambiar mensajes entre procesos, incluidos 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:

Nota: es posible deshabilitar localmente la verificación hilo seguro Desactivar localmente la verificación hilo de seguridad ver abajo)

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

En algunos casos, puede que prefiera que la verificación "thread-safety" de los comandos no se aplique a algunas partes del código, como por ejemplo, cuando tiene comandos no hilo seguro que sabe que nunca se van a llamar.

Para hacer esto, debe rodear el código a excluir del comando hilo seguro utilizando las directivas específicas %T- y %T+ como comentarios. El comentario //%T- desactiva la verificación hilo seguro y el comentario //%T+ la reactiva:

  // %T- para deshabilitar la verificación hilo seguro
 
  // Coloque el código que contiene los comandos que se excluirán de la verificacion hilo seguro
 $w:=Open window(10;10;100;100) //por ejemplo
 
  // %T+ para reactivar nuevamente la verificación hilo seguro para el resto del método

Por supuesto, el desarrollador 4D es responsable de que el modo apropiativo del código sea compatible con las directivas de activación y de reactivación. Se generarán errores de tiempo de ejecución si se ejecuta código hilo no seguro en un hilo apropiativo.



Ver también 

Command name
New process

 
PROPIEDADES 

Producto: 4D
Tema: Procesos

 
CONTENIDO DE LA PÁGINA 
 
HISTORIA 

Creado por: 4D v15 R5

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v20)
Manual de lenguaje 4D ( 4D v20.1)
Manual de lenguaje 4D ( 4D v20.2)
Manual de lenguaje 4D ( 4D v20.3)
Manual de lenguaje 4D ( 4D v20.4)
Manual de lenguaje 4D ( 4D v20.5)
Manual de lenguaje 4D ( 4D v20.6)