Предотвращение многократного выполнения

У меня есть этот скрипт задания Django cron (для этого я использую kronos, и это здорово).

Поскольку я запускаю это задание каждую минуту, я хочу убедиться, что другой экземпляр сценария уже не запущен. Если есть предыдущее задание, я хочу пропустить текущее выполнение.

Я знаю, что могу сделать это с помощью файла блокировки, но это не очень надежно и может вызвать проблемы при перезагрузке в середине выполнения (вы должны очистить файл блокировки) и т. д.

Как лучше всего это сделать с помощью Python (в данном случае Django)?

РЕДАКТИРОВАТЬ: я ориентируюсь на Linux, извините, что упустил это.


person kolrie    schedule 22.03.2013    source источник
comment
На какой платформе? В наши дни файл блокировки абсолютно надежен на большинстве платформ Unix/Linux: используйте os.open с O_CREAT|O_EXCL, что гарантирует, что только один процесс имеет доступ к файлу и пути, который соответствует файловой системе на основе памяти или подкачки (например, tmpfs : /tmp в Solaris, /run или /var/run в Linux), что решает ваши проблемы с перезагрузкой. Единственная потенциальная проблема заключается в том, что ваш процесс дает сбой, не очищается и т. Д.   -  person isedev    schedule 22.03.2013
comment
Другой вариант — использовать семафор на основе ядра.   -  person isedev    schedule 22.03.2013
comment
Извините, ребята, Linux :-)   -  person kolrie    schedule 22.03.2013
comment
Я бы тоже хотела это знать :)   -  person DanH    schedule 19.04.2013


Ответы (1)


Здесь есть приложение Django: https://github.com/jsocol/django-cronjobs

Также доступен на пипсе как cronjobs.

На всякий случай, если вы пойдете прямо к пункту; Вы регистрируете задания с помощью декоратора следующим образом:

# myapp/cron.py
import cronjobs

@cronjobs.register
def periodic_task():
    pass

Затем запустите команду через:

$ ./manage.py cron periodic_task

По умолчанию у него есть блокировка заданий, но вы можете отключить ее при применении декоратора:

@register(lock=False)
person DanH    schedule 19.04.2013