Форум сайта python.su
49
fedorch
Но в случае перезагрузки системы вероятность коллизий многократно возрастает.
fedorch
Но на нем не бежит ни чего, что активно генерировало новые процессы.
fedorch
Соглашусь, что в нормальном режиме работы вероятность коллизий невелика, хотя о годах речь не идет ;-)
Офлайн
221
fedorch
не забывайте что по PID можно узнать и имя запускаемого процесса. Если даже какое то приложение получило такой же PID, по имени можно определить ваше ли это приложение или нет. ЧТо существенно понижает вероятность коллизий
Офлайн
49
Можете вообще обойтись без файла блокировки
import sys import platform import subprocess system = platform.uname()[0] if system in ('Darwin', 'Linux', 'FreeBSD'): p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) elif system in 'Windows': p = subprocess.Popen(['tasklist'], stdout=subprocess.PIPE) else: sys.stderr.write('unknown OS') sys.exit() out, _ = p.communicate() if out.count(sys.argv[0]) >= 2: sys.stderr.write('program is already running') sys.exit()
Отредактировано Alen (Март 8, 2014 07:52:08)
Офлайн
0
Благодарю всех откликнувшихся. Буду пробовать.
Офлайн
Я такую штуку пользую: https://github.com/lorien/grab/blob/master/grab/tools/lock.py#L58
Суть в том, что открываем файл и лочим его. Проблемы с крахом программы или перезагрузкой ОС - нету. Лок снимется автоматически.
Отредактировано lorien (Март 8, 2014 16:28:33)
Офлайн
0
lorienНу так я и пытался сделать что-то подобное, только гораздо проще. И это у меня на половину ;-) получилось.
Суть в том, что открываем файл и лочим его. Проблемы с крахом программы или перезагрузкой ОС - нету. Лок снимется автоматически.
Офлайн
Под виндой ваш код, по крайней мере тот, что в начале топика, тоже может глючит. Например, процесс проверил, что файла блокировки нет и начал его создавать. Но между тем как он проверил и тем, как он начал создавать файл, другой процесс уже успел создать файл. У вас будут запущены два процесса и оба будут думать, что они работают в единственном экземпляре.
Офлайн
49
fedorch
А вот с Linux - засада. Там, как сейчас оказалось, можно запросто стереть файл в который кто-то сейчас пишет и этот кто-то даже ничего и не заметит и будет продолжать писать в несуществующий больше файл и дальше. И ни кто на это внимания не обратил.
Alen
В Linux/MacOS X/BSD работать не будет
Офлайн
0
lorienСпасибо, первая конструктивная критика моего кода, а не предложение сделать (по другому, как у всех, как принято 50 лет).
Под виндой ваш код, по крайней мере тот, что в начале топика, тоже может глючит. Например, процесс проверил, что файла блокировки нет и начал его создавать. Но между тем как он проверил и тем, как он начал создавать файл, другой процесс уже успел создать файл. У вас будут запущены два процесса и оба будут думать, что они работают в единственном экземпляре.
lorienПри внимательном изучении этого кода обнаружил одну странность. Если в Unix части перехватываются вообще ВСЕ исключения от flock(), что не хорошо, но частично оправданно, так как в разных версиях там генерируются разные типы исключений. То в Windows части перехватывается только одно исключение от LockFileEx() и у него проверяется код ошибки. Получается, что если блокировка не получилась по причине наличия другой блокировки, то возвращаем False и считаем, что блокировка не удалась. А, если блокировка не получилась по какой то другой причине, то возвращаем True и считаем, что блокировка удалась ;-(
Я такую штуку пользую: https://github.com/lorien/grab/blob/master/grab/tools/lock.py#L58
Alen
Вообще то в первом же ответе.Alen
В Linux/MacOS X/BSD работать не будет
Офлайн
То в Windows части перехватывается только одно исключение от LockFileEx() и у него проверяется код ошибки. Получается, что если блокировка не получилась по причине наличия другой блокировки, то возвращаем False и считаем, что блокировка не удалась. А, если блокировка не получилась по какой то другой причине, то возвращаем True и считаем, что блокировка удалась ;-(Да фиг знает, мне если честно, по барабану как этот код работает под виндой т.к. я использую его исключительно под linux. Если кто-то найдёт там баг в windows-реализации и пришлёт патч, конечно, я буду рад применить его к исходному коду :)
Офлайн