JeuWeb - Crée ton jeu par navigateur
randomizer les crons - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : randomizer les crons (/showthread.php?tid=4777)

Pages : 1 2


randomizer les crons - Valter - 27-04-2010

Bonjour.

je me pose la question suivante : comment randomizer les crons ?
C'est-à-dire, au lieu d'une mise à jour toutes les 5 heures, une mise à jour entre 2 et 16 heures par exemple.

Pour information, je n'ai pas de serveur dédié à ma disposition pour cela donc ça devra se faire sans (si c'est faisable autrement, bien sûr).


RE: randomizer les crons - garf - 27-04-2010

Peux tu nous dire l'interet de le faire ?

Techniquement, je pense pas que ce soit possible de modifier l'heure de réalisation d'un cron de manière variable, en particulier, si tu n'as pas accès a la crontab. Cependant tu dois pouvoir modifier ta tache cron de manière à ce qu'elle s'exécute ou non selon certains paramètre qui peuvent être aléatoire.


RE: randomizer les crons - Crimson - 27-04-2010

Ce n'est pas faire une heure de lancement aléatoire qu'il faut prévoir. Enfin si, mais pas du cron, juste du script.

En clair lancer le cron toutes les heures et stocker en base de données l'heure a laquelle il doit s'exécuter.
Si l'heure actuelle correspond a celle en bdd tu lances ton script sinon tu attends.

Tu peux faire la même chose avec un compteur que tu décrémentes a chaque fois que le cron se lance. et que tu réinitialise a chaque fois que ton script se termine.

Edit: Lancer un cron toutes les heures est possible via différents sites qui proposent des système de cron.


RE: randomizer les crons - Sephi-Chan - 27-04-2010

Tu lance le cron toutes les heures.
Ta tâche va lire une table task_ranges qui dispose de 2 colonnes de type datetime : l'heure de début du cycle et celle de fin. Tu as aussi un booléen qui indique si la tâche a été réalisée pour cette période.

Ainsi quand ton script s'exécute, tu cherches la task_range dans laquelle tu es à cet instant (et la crée si elle n'existe pas et que la période précédente est passée) puis tu lance un random entre 1 et le nombre d'heures couvertes par ta période. Si le nombre obtenu est 1 (fixé arbitrairement), tu exécutes ta tache, tu mets ton booléen à true.

Il faut aussi forcer l'exécution de la tâche s'il n'y aura plus d'appel au script pour la période trouvée.

Ainsi, ton script ne sera évalué qu'une fois dans ta période.


Sephi-Chan


RE: randomizer les crons - Valter - 27-04-2010

Oui, c'était la solution "dernier recours". J'y avais pensé, mais de manière un peu différente.

Je pensais à un fichier texte (avec 0 ou 1 si c'est déjà fait) et une exécution toutes les 30 mins.
Donc au début : rand(0, 48) puis, si pas d'exécution, rand(0, 47),etc... le problème c'est que ça risque de foutre beaucoup d'exécutions vers la fin.

Merci de l'aide.


RE: randomizer les crons - Ter Rowan - 28-04-2010

l'autre solution étant de mettre une proba fixe et si au bout de n heures, rien n'est fait tu forces la mise à jour


Si tu choisis une proba de 20% quelque part tu "espères" que toutes les 5 heures (ou demi heures) il y aura une mise à jour

si tu poses 5% tu "espères" que toutes les 20 heures il y aura mise à jour

évidement ce n'est qu'une espérance, tu as donc une probalilité que rien ne se passes au bout de 3 jours. D'où l'intérêt de forcer une mise à jour

L'intéret par rapport à (0 48) puis (0 47) puis (0 46), etc... c'est que toutes les heures ont les mêmes chances de voir la mise à jour tu seras donc bcp moins souvent (vers la fin)


RE: randomizer les crons - QuentinC - 28-04-2010

Le coup du cron horaire + probabilité n'est pas 100% aléatoire. En effet, la tâche ne peut être exécutée qu'à 7h00, 8h00, 9h00, 10h00..... jamais à 7h12 ou à 8h31 par exemple.

Il faudrait utiliser la commande at plutôt que cron. Chaque exécution programmerait la suivante en choisissant une date aléatoire du genre maintenant + entre 3600 et 86400 secondes. Evidemment, il faut avoir un dédié par contre.

La solution simple consiste à stocker une date dans un fichier ou en base et de la comparer à chaque fois, et si elle est passée, exécuter la tâche et en programmer une nouvelle. Mais c'est beaucoup de tests inutiles.


RE: randomizer les crons - keke - 28-04-2010

Ou sinon tu mets une pause dans ton script. La durée de la pause se calcule aléatoirement.

Tu pourras ainsi lancer ta tache à 7h00 du mat. Son execution pourra se faire qu'à partir de 9h15.

Quel est le langage de ton script ?

kéké


RE: randomizer les crons - NicoMSEvent - 28-04-2010

est-ce que ta mise a jour est "prévisible"?
Dans ce cas, je pense a un système sans cron répétitifs qui ne serviraient a rien tant qu'il n'y a pas de changement (et une plus grande flexibilité pour l'heure de lancement)
c'est à dire, par exemple :

toutes les case ayant une altitude inférieure a 10 seraient innondées après 10h13.
Comme c'est prévisible, il suffirait d'inclure a ta table "terrain" une date de début et une date de fin à chaque case, qui ne chevauche pas. ça va demander plus d'espace en base de donnée, mais je pense que ça en vaut la peine. Tu aurais un script qui choisi ta date aléatoire, et qui créerait des lignes en fonction de ça
Code :
x=123;y=321;altitude=9;date_debut=01/04/2010 00h00;date_fin=28/04/2010 10h12;type=prairie
x=123;y=321;altitude=9;date_debut=28/04/2010 10h13;date_fin=30/04/2010 00h00;type=eau
x=123;y=321;altitude=9;date_debut=30/04/2010 00h01;date_fin=NULL;type=marais

Maintenant, si il y a des éléments touchés en cascade (par exemple, montres ou joueurs sur les cases inondées), à l'heure du changement, quand tu aurais ton cron qui s'occupe de faire bouger les monstres, ou un joueur qui se connecte, de vérifier si l'heure de changement est dépassée, et d'agir en conséquence.
En cas de grandes modification, il se peut que ça prenne du temps pour ce cas de figure

Si quelqu'un pense a un système pour régler ce problème (sur lequel je planche actuellement), il est le bienvenu Smile


RE: randomizer les crons - Valter - 30-04-2010

c'est de l'asp.net (c#).
Et pour lancer le script et mettre en pause toute la journée (presque), l'idée est intéressante mais je sais pas si l'hébergeur voudra.

la mise à jour est pas vraiment prévisible non, au contraire le but est qu'elle soit in-devinable.