Verrouillage RW d'un fichier Windows en Python, de sorte qu'au plus une instance de test s'exécute par nuit

StackOverflow https://stackoverflow.com/questions/5443781

Question

J'ai écrit un harnais de test personnalisé en Python (les éléments existants ne convenaient pas en raison de beaucoup de logique personnalisée).Le planificateur de tâches Windows le lance une fois par heure chaque jour.Comme mes tests durent désormais plus de 2 heures et s'allongent, je rencontre des problèmes.Pour le moment, je vérifie simplement l'heure du système et je ne fais rien à moins que hour % 3 == 0, mais je n'aime pas ça.J'ai un fichier texte qui contient :

# This is a comment
LatestTestedBuild = 25100

# Blank lines are skipped too
LatestTestRunStartedDate = 2011_03_26_00:01:21

# This indicates that it has not finished yet.
LatestTestRunFinishDate = 

Parfois, lorsque je lance un test manuellement, cela peut arriver à tout moment, y compris à 12: 59: 59,99 Je veux supprimer autant que possible les conditions de course.Je préfère faire un effort supplémentaire une fois et ne pas m'inquiéter de la probabilité pratique que quelque chose se produise.Donc, je pense que verrouiller ce fichier texte de manière atomique est la meilleure approche.

j'utilise Python 2.7, Windows Server 2008R2 Pro et Windows 7 Pro.Je préfère ne pas installer de bibliothèques supplémentaires (Python n'a pas encore été "vendu" à mes collègues, mais je pourrais copier localement un fichier qui implémente tout cela, à condition que la licence le permette).

Alors, s'il vous plaît, suggérez un bon moyen à toute épreuve de résoudre ce problème.

Était-ce utile?

La solution

Lorsque vous commencez à exécuter un test, créez un fichier appelé __LOCK__ ou quelque chose.Supprimez-le lorsque vous avez terminé, en utilisant un bloc try...finally pour vous assurer qu'il est toujours effacé.N'exécutez pas le test si le fichier existe.Si l'ordinateur tombe en panne ou similaire, supprimez le fichier à la main.Je doute que vous ayez besoin de plus d'intelligence que cela.

Etes-vous sûr d'avoir besoin de 2 heures de tests ?!Je pense que 2 minutes est une durée plus raisonnable, même si je suppose que si vous exécutez des chiffres compliqués, vous pourriez avoir besoin de plus.

exemple de code :

import os
if os.path.exists("__LOCK__"):
    raise RuntimeError("Already running.") # or whatever
try:
    open("__LOCK__", "w").write("Put some info here if you want.")
finally:
    if os.path.exists("__LOCK__"):
        os.unlink("__LOCK__")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top