RW-блокировка файла Windows в Python, так что не более одного тестового экземпляра выполняется за ночь - PullRequest
0 голосов
/ 26 марта 2011

Я написал собственный тестовый набор на Python (существующий материал не подходил из-за большого количества пользовательской логики).Планировщик задач Windows запускает его раз в час каждый день.Поскольку мои тесты теперь занимают более 2 часов и растут, у меня возникают проблемы.Сейчас я просто проверяю системное время и ничего не делаю, если не hour % 3 == 0, но мне это не нравится.У меня есть текстовый файл, который содержит:

# 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 = 

Иногда, когда я запускаю тест вручную, это может произойти в любое время, включая 12: 59: 59.99. Я хочу максимально удалить условия гонки.,Я предпочел бы приложить дополнительные усилия один раз и не беспокоиться о практической вероятности того, что что-то случится.Итак, я думаю, что блокировка этого текстового файла атомарно - лучший подход.

Я использую Python 2.7, Windows Server 2008R2 Pro и Windows 7 Pro.Я предпочитаю не устанавливать дополнительные библиотеки (Python еще не был "продан" моим коллегам, но я мог бы скопировать файл локально, который реализует все это, при условии, что лицензия это позволяет).

Итак, предложите хороший, пуленепробиваемый способ решения этой проблемы.

1 Ответ

1 голос
/ 27 марта 2011

Когда вы запускаете тест, создайте файл с именем __LOCK__ или что-то в этом роде. Удалите его, когда закончите, используя блок try ... finally, чтобы он всегда очищался. Не запускайте тест, если файл существует. Если компьютер дает сбой или аналогичный, удалите файл вручную. Я сомневаюсь, что тебе нужно больше ума, чем это.

Вы уверены, что вам нужно 2 часа тестов ?! Я думаю, что 2 минуты - это более разумное количество времени, хотя я думаю, что если вы используете сложные цифры, вам может понадобиться больше.

пример кода:

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__")
...