LINUX.ORG.RU

Python Mutex


0

1

Задача: есть скрипт, который, если запустить его еще раз, должен выдать "Program is already running!" Как сделать с помощью mutex это? В pydoc mutex не понял...

anonymous

> Задача: есть скрипт, который, если запустить его еще раз, должен выдать "Program is already running!" Как сделать с помощью mutex это?

А вам точно mutex нужен? Можно, просто, при первом запуске скрипта создавать lock/pid файл, который далее админить.

kondor ★★★
()
Ответ на: комментарий от kondor

Уже это обсуждалось: во-первых, не кроссплатформенно, во-вторых, lock при ресете не удалится, в-третих, если убъется эта прога и запустится другая с тем же PID и названием, мой скрипт никогда не запустится...

anonymous
()
Ответ на: комментарий от anonymous

> во-первых, не кроссплатформенно

open() очень даже кроссплатформен.

> во-вторых, lock при ресете не удалится

timestamp

kondor ★★★
()
Ответ на: комментарий от anonymous

> wtf timestamp?

Как пример: каждый промежуток времени обновлять для данного lock/pid файла время модифицации (подобно поведению /bin/touch). При попытке запустить очередную копию, проверять:
if (lock_file.timestamp() - current_time()) > N:
lock_file.erase()
lock_file.new()
lock_file.putData("technical information")
...
else:
print "Process already running!"
exit(1)

что-то вроде этого

kondor ★★★
()
Ответ на: комментарий от kondor

Дурацкое форматирование.

Кстати, flock() совсем даже необязательно использовать.

kondor ★★★
()
Ответ на: комментарий от kondor

>Как пример: каждый промежуток времени обновлять для данного lock/pid файла время модифицации (подобно поведению /bin/touch). При попытке запустить очередную копию, проверять: if (lock_file.timestamp() - current_time()) > N: lock_file.erase() lock_file.new() lock_file.putData("technical information") ... else: print "Process already running!" exit(1)

Кривое решение.

anonymous
()
Ответ на: комментарий от anonymous

Ну если тебе край нужен мутех, то можешь это сделать так :-)

#!/usr/bin/env python

import time
import os
import sys

class Mutex(object):
    def __init__(self, name='mutex'):
        self.name = name
        self.file = None

    def lock(self):
        self.file = open(self.name, 'w')
        self.file.close()

        os.remove(self.name)
        self.file = open(self.name, 'w')

    def unlock(self):
        self.file = None

def main():
    mutex = Mutex()
    try:
        mutex.lock()
    except OSError:
        print 'Oops, another instance of script running. Terminating...'
        sys.exit(1)

    while True:
        print 'working...'
        time.sleep(1)

if __name__ == '__main__':
    main()

redvasily
()
Ответ на: комментарий от anonymous

Создавать не файл, а каталог с определённым именем. кроссплатформенно. только если програма упадёт, не удалив каталог - тогда швах

smartly ★★★
()
Ответ на: комментарий от anonymous

У каждого процесса будет свой мутех. Т.е. каждый процесс заблокирует свой мутех, и они оба будут весело работать вместе.

Тебе для этого нужен именованный мутех на уровне операционки, т.е.:

1. Не кроссплатформенно

2. Не в стандартной библиотеке питона

Кстати, вопрос ты задал классно, сама формулировка вопроса исключает возможность дать правильный ответ. Одно хорошо, это ЛОР, а значит оригинальный вопрос никого не волнует, а комментсы рулят.

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

redvasily
()
Ответ на: комментарий от redvasily

А средствами СУБД можно решить данную проблему (универсальным для всех СУБД способом)?

anonymous
()

Можно еще попробовать сокет занять и сделать на нем listen(). Вполне, даже, кроссплатформенно.

kondor ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.