Comment créer un déclencheur toutes les 30 secondes avec le cron d' un scénario

Je m’engage en rien sur l’impacte ressource … je n’ai pas les connaissances nécessaires sur ce sujet.
Je fait juste constaté que le core utilise un sleep pour atteindre l’heure exacte de lancement de son contenu lorsque celui-ci est exécuté par un bloc DANS.

Juste pour préciser ce point là

Lorsque tu fais un DANS, il y a une tâche cron de créée. Le sleep n’est la que pour les secondes restantes.

Exemple : un DANS de 10 minutes créé à 10h20m12s, il y aura :

  • un cron créé pour se déclencher à 10h30 suivi d’un sleep de 12 secondes pour qu’il y ait exactement 10 minutes d’écoulées.

Ce qui ne change pas le fait qu’un sleep n’est pas consommateur de ressources :wink:

Édit : @Phpvarious a été plus rapide que moi :slight_smile:

@tomdom @Phpvarious
Merci pour les précisons.

J’avoue que mon avis est assez tranché depuis que j’ai demandé avis à un ami, qui travail pour un GAFAM dans les programmes « Bas niveau » (ceux qui gère la couche matériel / Qui traduit le programme des copains pour gérer le matériel).
Celui-ci m’avait indiqué qu’il ne pouvait pas répondre pour Jeedom, mais qu’il serait étonné que linux ne traduise pas un « pose sur un programme » en « je te mets de coté et te reprend plus tard ».
(bon, c’était m’a traduction, car honnêtement, je comprenait un mot sur 2 quand il parlait…)
Bref, la réponse courte était : Il est plus que probable que le processeur ne soit pas du tout impacté par un Sleep.
PS : Désolé pour le hors sujet, j’arrete là…

1 « J'aime »

hello,

Quand je pense que j’avais lu qu’il fallait éviter d’utiliser des SLEEP et plutôt mettre des DANS.
Donc j’avais revu mes scénarios et je me sentais serein et heureux du travail accompli avec l’impression que ma Smart se retrouvait légère , très légère .
Ne lui dites pas que je sais maintenant que les DANS sont tout aussi impactants elle risque de se mettre en carafe :sunglasses:

1 « J'aime »

L’un ET l’autre, ne sont… si peu, impactant !

Certainement en terme d’impac visualisable.
Mais pour la rigueur et la logique si on reprend l’explication de tomdom sur le Dans et le sleep pour juste ajuster le temps à la seconde près, il est bien plus préférable ou beau ou rigoureux etc … d’utiliser un Dans quand le temps dépasse la minute.
Enfin c’est ce que j’en conclu.

L’utilisation de sleep() a un impact sur la latence et la charge du processeur.
Au niveau du noyau, la fonction sleep() travaille au niveau de la ms.
Mettons que vous dormez pendant 1 ms et vérifiez une variable partagée au réveil. La latence moyenne sera d’au minimum 0,5 ms.
Donc, consommation de cycles CPU dans ce thread non actif pour interroger la variable partagée. En plus, il n’y a souvent aucune garantie quant au temps de sommeil.

Le système d’exploitation fournit des services pour communiquer/synchroniser entre les threads/processus. Ceux-ci ont une faible latence, consomment moins de cycles CPU et ont souvent d’autres garanties, ce sont celles-ci qu’il faut utiliser en priorité.

Après, vous faites ce que vous voulez.

Bonjour,

Ça dépends surtout de la finalité. Sémantiquement parlant, on a bien 2 notions :

  • Dans : je veux quelques choses plus tard
  • Sleep : j’ai besoin d’attendre , temporiser

Imaginons un scénario contenant plusieurs actions, dans 1 cas, il faut attendre 3 minutes mais en générale il n’y a pas besoin :

Avec un sleep :

if condition alors
   sleep 3 minutes
action1
action2
action n

avec DANS :

if condition then
 dans 3 minutes 
     la je fais quoi ? je duplique les actions ? Je fais un sous scénarion ?
action1
action2
actionn

Donc les choses ne sont pas toujours évidentes et il faut utiliser les instructions/fonctions qui répondent au besoin en se méfiant des dogmastisme :wink:

En l’écrivant comme ça peut-être

Attention à ne pas mal interpréter …

Un bloc DANS crée une tache cron, aucun sleep ici.

Quand le cron arrive, il lance doin. çà peu être 1h ou 10ans après, toujours aucun sleep utilisé …

Et là, si et seulement si il a une valeur de seconde en paramètre, il fait un sleep (donc de secondes, inférieur à la minute), pour gérer ce que ne gère pas une tache cron (la précision de secondes).

Donc dans 99.9% des exécutions de DANS il n’y a AUCUN sleep dans le Core.

C’est quoi cette histoire de variable partagée et consommation de cycles CPU dans un thread non actif ?
Fais-tu une différence entre un thread non actif à cause d’un sleep (fonction nanosleep de la libc sous linux) d’un thread non actif pour d’autres raisons ?

Oui mais si tu n’as pas besoin d’attendre. Dans mon exemple (tiré par les rares cheveux qu’il me reste :wink: ), les actions sont exécutés dans tous les cas .
Donc avec le dans, je suis obligé de dupliquer les actions alors qu’avec le sleep non.

Mais c’était juste pour illustrer, qu"à mon avis, il ne faut pas être si tranché que ça sur la non utilisation de la fonction sleep

Édit : j’arrête mon hors sujet là. Bonne journée à tous :slight_smile:

Lol j’interprète rien, je constate :yum:

Pas de débat :wink:, mais 99.9%, sa dépend plutôt du déclencheur, si c’est un programmé, je peut comprendre, mais si c’est par exemple un capteur de mouvement…

Ça reste que ton exemple est justement un exemple de ce qu’il ne faut pas faire selon moi.
Il y a une erreur de conception à la base et d’autres solutions existent mais il faut savoir faire un pas en arrière et regarder la situation.
Par exemple dans le si mettre un bloc dans et relancer le scénario.

On peut utiliser des sleep autant qu’on veut mais au delà de quelques secondes faut se poser des questions.

Et donc quoi que tu en dises un sleep qui bloque un thread bloque donc des ressources (cpu et mémoire) anodin peut être sur un cas isolé mais la limite existe: il suffit de regarder le nombres de posts avec des problèmes de mémoire insuffisante ou des charges cpu trop importante => attention je ne dis pas que ca vient (uniquement) de sleep utilisé mais cela veut donc dire que limite il y a et pour certains elle n’est pas si loin.

Je partage totalement ton avis.
En ce qui me concerne, je n’utilise le sleep que lorsque je veux réellement interrompre le thread, par exemple lorsque j’envoie des commandes successives pour être sûr de leurs prises en compte par le contrôleur avant de passer à la suivante. Je n’ai jamais eu avec Jeedom à traiter des évènements à la seconde même si j’en reconnais la possible utilité.
Sinon, on peut toujours s’arranger avec un DANS ou un A.
Ce n’est aucunement du dogmatisme, mais quand on fait 30 ans de T/R, on essaie de maîtriser au mieux ses processus. Autant laisser faire au noyau ce pour quoi il est fait.
Bon dimanche, il fait beau, autant en profiter.

1 « J'aime »

Je n’ai pas regardé le code du core mais je parle de mémoire de ce que j’ai compris quand Loic est intervenu sur ce sujet.
En espérant avoir bien compris, le sleep sert à rattraper le nb de secondes manquantes entre le timestanp du cron et le timestamp du lancement du cron par le scénario.
Comme il est rare que le timestamp du lancement par le scénario finisse par 00 soit divisible par 60 j’aurai tendance à dire que dans 99,9% du temps, il y a un sleep associé.

Un sleep de qql secondes, le message pouvait laisser croire qu’un DANS faisait un sleep de 3j :laughing:

1 « J'aime »

Non, car déjà précisé plus haut.

C’est mon dernier message sur ce sujet car ça commence à tourner en boucle.
Juste une précision

Ce n’est pas ce que j’en dis. C’est la façon dont est implémenté la gestion des thread/process sous linux. Un thread/process qui « dort » passe à l’état S (Sleep interruptible) et ne consomme pas de CPU (suffit d’aller voir dans les sources du noyau mais on s’éloigne de Jeedom).

C’est pas tout ça mais il y a Italie-France :rugby_football:

1 « J'aime »

Rebonjour

Un grand merci à vous tous pour avoir répondu avec une telle passion! :ok_hand: :+1:

A vous lire ,je pense que la solution passe tout aussi bien par le hardware que par le software …tout dépend de ces connaissances ou sensibilité du moment en electronique et/ou en programmation . :slightly_smiling_face: