Comment puis-je obtenir monotone durées de temps en python?
Je veux ouvrir une session combien de temps cela prend dans la vraie walltime. Actuellement, je suis en train de faire ceci:
startTime = time.time()
someSQLOrSomething()
print "That took %.3f seconds" % (time.time() - startTime)
Mais qui ne manquera pas de (produire des résultats incorrects) si l'heure est réglée pendant que la requête SQL (ou quoi que ce soit) est en cours d'exécution.
Je ne veux pas simplement référence à elle. Je veux ouvrir une session dans une application en direct afin de voir les tendances sur un système live.
Je veux quelque chose comme clock_gettime(CLOCK_MONOTONIC,...), mais en Python. Et de préférence sans avoir à écrire un module C qui appelle clock_gettime().
- Eh bien, je ne sais pas vraiment comment souvent, c'est en réalité ajusté. Je tourne NTP. Mais avec un mononotic horloge je n'aurai pas à courir dans des trucs comme l'Oracle RAC bug où il redémarré le système, si le temps a été mis à l'envers. D'ailleurs petite NTP ajustements il y a des secondes intercalaires qui peut aller d'avant en arrière.
- S. Lott: incorrect. "Un saut de seconde est positive ou négative-un deuxième ajustement [...]". Il est trivial de chercher. C'est la première phrase de la "seconde intercalaire" article sur Wikipédia. Alors, quand un saut de seconde est ajouté, NTP permettra de réajuster le système de remonter le temps (parce que votre système est rapide. Il n'a pas compté 23:59:60), ce qui signifie un temps.time()-base de mesure peut être négatif. Croyez-moi, beaucoup de serveurs Oracle redémarré en raison du bug je l'ai mentionné ci-dessus newyears. Et j'ai simplement utilisé Oracle comme exemple le cas de certains programmes ne peuvent pas gérer le temps de réajustements.
- Je ne sais pas pourquoi (non corrigés) Oracle 10 fait. Il n'a tout simplement, et Oracle (la société) le confirme.
- Je voulais juste rajouter un commentaire ici d'un cas d'utilisation que nous avons rencontrés. Au sein de notre programme d'installation qui se compose d'un certain nombre de systèmes de vmware, nous avons remarqué que le temps "ajustements" ne se produisent assez régulièrement dans les vm, en particulier avec l'hôte de la charge avg. est élevé. Il en résulte des choses comme
supervisord
qui semblent dépendre du temps.temps (le) de s'écraser résultant d'abandonner le processus qu'il a commencé. Nous avons ^fixe^ ce problème en appliquant le patch - github.com/Supervisor/supervisor/pull/468 - En théorie, il pourrait être négatif des secondes intercalaires. Dans la pratique, toutes les secondes intercalaires sont positifs. Voir Le saut de seconde: son histoire et son avenir possible.
Vous devez vous connecter pour publier un commentaire.
De cette fonction est assez simple que vous pouvez utiliser ctypes pour y accéder:
CLOCK_MONOTONIC_RAW==4
(depuis Linux 2.6.28; spécifique à Linux) pour éviter NTP ajustements.CLOCK_MONOTONIC_RAW
au lieu deCLOCK_PROCESS_CPUTIME_ID
? Ce qui est vraiment la différence? (la documentation ici: man7.org/linux/man-pages/man2/clock_gettime.2.html). C exemple d'utilisation deCLOCK_PROCESS_CPUTIME_ID
ici: stackoverflow.com/questions/6749621/...CLOCK_PROCESS_CPUTIME_ID
: "Le temps de traitement ne peut pas être définie. Il n'est pas monotone: les horloges s'arrêtent alors que le processus est ralenti." Il n' pas count pendant le sommeil ou à suspendre. Basé sur cette recherche, et le lien ci-dessus, je veux utiliserCLOCK_HIGHRES
(notamment suspendre le temps trop) ouCLOCK_MONOTONIC
je pense, d'être "chargement pivote" sur Linux (je pense que cela signifie pour l'ajuster pour plus de précision ici...comme un calibrage???) Source: python.org/dev/peps/pep-0418/#monotonic-clocks.CLOCK_MONOTONIC_RAW
au lieu de cela, tout comme vous avez fait, car il est "Semblable à CLOCK_MONOTONIC, mais donne accès à un raw matériel de base de temps qui n'est pas soumis à NTP [Network Time Protocol] les ajustements ou les ajustements effectués par adjtime(3)." (man7.org/linux/man-pages/man2/clock_gettime.2.html). Donc, j'ai répondu à ma propre question, à condition que certaines des liens utiles pour aider les autres, et la boucle est bouclée pour accepter ce qui de l'horloge que vous avez choisi et aimé d'horloge le meilleur, pour base bas-niveau de l'horodatage précis et mesures de l'intervalle.Maintenant, en Python 3.3, vous utilisez temps.monotone.
CLOCK_MONOTONIC
et pasCLOCK_MONOTONIC_RAW
, ce dernier n'est même pas être disponible en Python 3.3.time
module connaîtCLOCK_MONOTONIC_RAW
bien qu'il ne l'utilise pas autant que je peux voir. Vous pourriez définir l'horloge qui l'utilise viactypes
même sur Python 2.7CLOCK_MONOTONIC_RAW
en appelanttime.clock_gettime(time.CLOCK_MONOTONIC_RAW)
, ce qui est excellent lorsque vous l'utilisez pour mesurer de petits intervalles de temps, vous n'obtiendrez jamais l'erreur introduite lorsque le réseau des mises à jour de l'heure via NTP (Network Time Protocol) ajustements. Python temps de référence: docs.python.org/3/library/time.html#time.CLOCK_MONOTONIC_RAW. <-- NOTE: POUR UNIX/LINUX UNIQUEMENT. Pour Windows, il suffit d'appelertime.clock()
, qui a déjà microseconde ou une meilleure résolution, car il utilise le QueryPerformanceCounter().Comme l'a souligné dans cette question, en évitant NTP réajustements sur Linux nécessite CLOCK_MONOTONIC_RAW. Définies comme 4 sur Linux (depuis 2.6.28).
De façon portable de la constante #défini dans un en-tête C de Python est difficile; il n'y a h2py, mais qui n'a pas vraiment vous aider à obtenir la valeur au moment de l'exécution.
Voici comment je obtenir monotone de temps en Python 2.7:
Installer le
monotonic
package:Puis en Python:
time.monotonic()
pourrait être utile: