4D v16.3Process 4D préemptifs |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
Process 4D préemptifs
Process 4D préemptifs
4D Developer Edition 64 bits pour OS X (ainsi que pour Windows à compter de 4D v16 R2) proposent une puissante fonctionnalité : la possibilité d'exécuter du code 4D dans un process préemptif. Grâce à cette option, vos applications 4D compilées pourront tirer intégralement parti des machines multi-coeurs, ce qui leur permettra d'accélérer leur exécution et de prendre en charge davantage d'utilisateurs simultanément. Lorsqu'il est exécuté en mode préemptif, un process est dédié à un CPU (processeur). La gestion du process est alors déléguée au système, qui peut allouer chaque CPU séparément sur une machine multi-coeurs. Lorsqu'ils sont exécutés en mode coopératif (seul mode disponible dans 4D jusqu'à 4D v15 R5), tous les process sont gérés par le thread (process système) de l'application parente et partagent le même CPU, même sur une machine multi-coeurs. Par conséquent, en mode préemptif, les performance globales de l'application sont améliorées, particulièrement avec des machines multi-coeurs, car de multiples threads peuvent véritablement être exécutés simultanément. Les gains effectifs dépendent cependant de la nature des opérations exécutées. En contrepartie, puisqu'en mode préemptif chaque thread est indépendant des autres et non géré directement par l'application, des conditions spécifiques sont à respecter dans les méthodes qui doivent être exécutées en préemptif. De plus, le mode préemptif est disponible uniquement dans certains contextes. L'utilisation du mode préemptif est disponible uniquement dans les versions 64 bits de 4D. Les contextes d'exécution actuellement pris en charge sont les suivants :
Si le contexte d'exécution prend en charge le mode préemptif et si la méthode est "thread-safe", un process 4D lancé à l'aide de la commande New process ou CALL WORKER, ou via la commande de menu "Exécuter méthode", sera exécuté dans un thread préemptif. Sinon, si vous appelez New process ou CALL WORKER depuis un contexte d'exécution qui n'est pas pris en charge (par exemple sur un poste 4D distant), le process sera toujours coopératif. Note : Vous pouvez exécuter un process en mode préemptif depuis un 4D distant en démarrant une procédure stockée sur le serveur via le langage, par exemple avec Execute on server. Le code 4D code peut être exécuté en mode préemptif uniquement lorsque certaines conditions sont réunies. Chaque partie du code exécution (commandes, méthodes, variables, etc.) doit être compatible avec une utilisation en mode préemptif. Les éléments éligibles au mode préemptif sont qualifiés de thread-safe et ceux qui ne sont pas éligibles au mode préemptif sont qualifiés de thread-unsafe. Note : Comme un thread est traité de manière indépendante à partir de la méthode du process parent, la totalité de la chaîne d'appel ne doit contenir aucun élément thread-unsafe ; sinon, l'exécution en mode préemptif ne sera pas possible. Ce point est abordé en détail dans le paragraphe Quand un process est-il démarré en préemptif ?. La propriété "thread safe" de chaque élément dépend de l'élément lui-même :
Fondamentalement, le code destiné à être exécuté dans des threads préemptifs ne peut pas appeler d'éléments ayant des interactions extérieures telles que du code de plug-in ou des variables interprocess. L'accès aux données, cependant, est possible car le serveur de données de 4D prend en charge l'exécution en mode préemptif. Par défaut, 4D exécute toutes les méthodes projet de vos applications en mode coopératif. Si vous voulez bénéficier de la fonctionnalité du mode préemptif, la première étape consiste à déclarer explicitement toutes les méthodes que vous souhaitez démarrer en mode préemptif à chaque fois que c'est possible -- c'est-à-dire, les méthodes que vous estimez adaptées à une exécution dans un process préemptif. Le compilateur vérifiera que ces méthodes sont réellement thread-safe (voir Ecrire une méthode thread-safe pour plus d'informations). Vous pouvez également interdire le mode préemptif pour certaines méthodes, si nécessaire. Gardez à l'esprit que déclarer une méthode "capable" d'être utilisée en préemptif la rend éligible à l'exécution dans un process préemptif mais ne garantit pas qu'elle sera effectivement exécutée en mode préemptif dans l'application. Le démarrage d'un process en mode préemptif résulte d'une évaluation effectuée par 4D en fonction de toutes les méthodes de la chaîne d'appel du process (pour plus d'informations, veuillez vous reporter au paragraphe Quand un process est-il démarré en préemptif ?). Pour déclarer une méthode éligible à l'exécution en mode préemptif, vous devez sélectionner l'option de déclaration Mode d'exécution dans la boîte de dialogue Propriétés de la méthode : Les options suivantes sont proposées :
Note : Une méthode composant déclarée "Partagée entre composants et base hôte" doit également être déclarée "capable" pour pouvoir être exécutée dans un thread préemptif par la base hôte. Lorsque vous exportez le code de la méthode à l'aide, par exemple, de METHOD GET CODE, la propriété "preemptive" est exportée dans le commentaire "%attributes" avec la valeur "capable" ou "incapable" (la propriété n'est pas présente si l'option est "Indifférent"). Les commandes METHOD GET ATTRIBUTES et METHOD SET ATTRIBUTES permettent également de lire ou de fixer l'attribut "preemptive" avec les valeurs "indifferent", "capable" ou "incapable". Le tableau suivant résume les effets des options de déclaration du mode préemptif :
Rappel : L'exécution en mode préemptif est disponible en mode compilé uniquement. En mode compilé, lorsqu'un process est créé par la commande New process ou CALL WORKER, 4D examine la propriété "preemptive" de la méthode du process (aussi appelée méthode parente) et exécute le process en mode préemptif ou coopératif en fonction de cette propriété :
La propriété thread-safe dépend en fait de la chaîne d'appel. Si une méthode déclarée "capable" appelle une méthode thread-unsafe à n'importe lequel de ses sous-niveaux, une erreur sera retournée à la compilation : si une seule méthode de la chaîne d'appel est thread-unsafe, elle "contaminera" toutes les autres méthodes et l'exécution en préemptif sera rejetée par le compilateur. Un thread préemptif ne peut être créé que lorsque la totalité de la chaîne est thread-safe et que l'option "Peut être exécutée dans un process préemptif" a été sélectionnée pour la méthode process. Par exemple, considérons les méthodes projet suivantes : //Méthode projet MyDialog //Méthode projet MyComp //Méthode projet CallDial //Méthode projet CallComp L'exécution d'une méthode en mode préemptif dépendra de sa propriété "execution" et de la chaîne d'appel. Le tableau suivant illustre les diverses situations:
4D vous permet d'identifier le mode d'exécution des process en compilé :
Pour être thread-safe, une méthode doit respecter les conditions suivantes :
Note : Dans le cas d'une méthode "Partagée entre composants et base hôte", la propriété "Peut être exécutée dans un process préemptif" doit obligatoirement être sélectionnée. (*) Les process de type Worker vous permettent d'échanger des données entre n'importe quel process, y compris des process préemptifs. Pour plus d'informations, reportez-vous à la section A propos des workers. Les méthodes pour lesquelles la propriété "Peut être exécutée dans un process préemptif" a été cochée seront vérifiées par 4D durant la compilation. Une erreur de compilation est générée à chaque fois que le compilateur détecte un élément non compatible avec la propriété thread-safe : Le fichier de symboles, s'il est activé, contient également le statut thread safe pour chaque méthode : Puisqu'il s'agit d'accès "externes", les appels aux objets d'interface utilisateur tels que les formulaires ou le Débogueur ne ne sont pas possibles dans les threads préemptifs. Les seuls accès à l'interface utilisateur autorisés depuis un thread préemptif sont :
Un nombre important de commandes 4D sont "thread-safe". Dans la documentation, l'icône située dans la zone de propriété de commande indique que la commande est thread-safe. Vous pouvez obtenir la liste des commandes thread-safe en cliquant sur cette icône dans le manuel Langage. Vous pouvez également utiliser la commande Command name qui peut retourner la valeur de la propriété "thread-safe" pour chaque commande. Lorsqu'une méthode utilise une commande pouvant potentiellement déclencher un trigger, le compilateur de 4D évalue la propriété "thread-safe" du trigger afin de déterminer la compatibilité de la méthode avec le mode préemptif : SAVE RECORD([Table_1]) //le trigger sur Table_1, s'il existe, doit être thread-safe Voici la liste des commandes qui entraînent l'analyse du trigger à la compilation :
Si la table est passée dynamiquement, il est possible que le compilateur ne soit pas en mesure de déterminer le trigger à évaluer. C'est le cas par exemple dans les situations suivantes : DEFAULT TABLE([Table_1]) Dans ce cas, tous les triggers sont évalués. Si une commande thread-unsafe est détectée dans au moins un trigger, l'ensemble est rejeté et la méthode est déclarée thread-unsafe. Les méthodes d'interception d'erreurs installées par la commande ON ERR CALL doivent être thread-safe si elles sont susceptibles d'être appelées depuis un process préemptif. Afin de gérer ce cas, le compilateur vérifie le caractère "thread safe" des méthodes d'appel sur erreur passées à la commande ON ERR CALL au moment de la compilation et retourne des erreurs si elles ne sont pas compatibles avec l'exécution en mode préemptif. A noter que cette vérification est possible uniquement lorsque le nom de la méthode est passé en constante et n'est pas calculé, comme décrit ci-dessous : ON ERR CALL("myErrMethod1") //sera vérifiée par le compilateur De plus, à compter de 4D v15 R5, si une méthode projet d'appel sur erreur ne peut pas être appelée à l'exécution (à la suite d'un problème lié au mode préemptif ou pour toute raison, comme par exemple "méthode non trouvée"), une nouvelle erreur est générée : -10532 "Impossible d'ouvrir la méthode d'appel sur erreur 'nomMéthode'". Un process peut déréférencer un pointeur pour accéder à la valeur d'une autre variable process uniquement si les deux process sont coopératifs ; sinon, 4D retournera une erreur. Exemples avec les méthodes suivantes : Méthode 1 : myVar:=42 Méthode 2 : $value:=$1-> Si le process exécutant Méthode 1 ou le process exécutant Méthode 2 est préemptif, l'expression "$value:=$1->" provoquera une erreur d'exécution. L'utilisation des paramètres de type RefDoc (référence de document ouvert, utilisée ou retournée par les commandes Open document, Create document, Append document, CLOSE DOCUMENT, RECEIVE PACKET, SEND PACKET) est limitée aux contextes suivants :
Pour plus d'informations sur la référence RefDoc, veuillez vous reporter à la section RefDoc : numéro de référence de document.
Voir aussi
|
PROPRIÉTÉS
Produit : 4D
HISTORIQUE
Créé : 4D v15 R5 UTILISATION DE L'ARTICLE
4D - Langage ( 4D v16.1) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||