Форум сайта python.su
Доброго времени суток…
Имеется следующая проблема:
нужно сделать так, что бы программа запускалась только в одном экземпляре. Обычно это реализуется с помощью мьютексов. В python есть модуль threading, но с его помощью мне не удалось реализовать данную задачу.
Буду очень признателен, если кто поможет.
З.Ы.
Желательно сделать это силами только питона…
Офлайн
А причём здесь мьютексы? Они служат для синхронизации потоков в одном приложении.
Это скорее средствали оси. Посмотри модуль os, может чё и накопаешь.
Кстати вопрос интетесный, так что если найдёшь – отпишись уж. Буду благодарен.
Офлайн
Обычно, такая задача решается так: в системе блокируется какой-то ресурс и при попытке второго процесса залочить этот же ресурс, он получает отказ и сваливает, хорошо если он ещё и умеет сказать ранее запущенному процессу о своём появлении… И вот насчёт ресурсов тут туговато, всё слишком системозависимо, под *nix всё просто, можно залочить файл, создать именованный канал, и всё это стандартными средствами. В windows сложнее, но тоже возможно, из стандартного есть к примеру ctypes, с помощью которого можно добраться до системных функций windows и точно также залочить файл или создать именованный канал… Второй вариант мне больше нравится.
Гугл -> первая ссылка по запросу “python windows named pipe” - > http://mail.python.org/pipermail/python-list/2005-March/314328.html
Тебе понадобится функция “windll.kernel32.CreateNamedPipeA”, про неё всё написано в MSDN
Офлайн
С одного форума:
Не обязательно использовать Мьютексы, можно использовать любые именованые объекты системы… Суть механизма состоит в том, что приложение при старте пытается создать именованый объект который для системы имеет уникальный идентификатор, если объект создается - значит это первая и единственная копия данного приложения, если получаем исключение, значит приложение уже запущено, посылаем ему сообщение чтобы оно “выплыло” на передний план и закрываемся.Литература по этой теме, которая есть в инете в основной массе написана для делфи. Какие есть там способы:
Офлайн
poltergeist, спс
пока писал пост не увидел твоего=)
сейчас посмотрим…
идея с файлами тоже не очень нравиться…
Офлайн
ну.. могу предложить хак - открывай сокет на определенном порту. походу ни одна ос не дает открывать сокеты на одном порту дву разным програмам, и если порт занят - убивать программу
Офлайн
Соглашусь с Deekin,если пишешь под *nix, ИМХО лучше определять запущенную копию, по PID файлу.
Офлайн
ну.. могу предложить хак - открывай сокет на определенном порту. походу ни одна ос не дает открывать сокеты на одном порту дву разным програмам, и если порт занят - убивать программуПлохая идея.
Офлайн
poltergeisthttp://mail.python.org/pipermail/python-list/2000-October/057808.html
Обычно, такая задача решается так: в системе блокируется какой-то ресурс и при попытке второго процесса залочить этот же ресурс, он получает отказ и сваливает, хорошо если он ещё и умеет сказать ранее запущенному процессу о своём появлении…
DeekinГотовый рецепт: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/474070
Использование мьютексов (основан на том, что в системе может сущестоввать только один мьютекс с заданным именем)
Офлайн