Найти - Пользователи
Полная версия: Запуск одной копии программы
Начало » Python для экспертов » Запуск одной копии программы
1
Deekin
Доброго времени суток…

Имеется следующая проблема:
нужно сделать так, что бы программа запускалась только в одном экземпляре. Обычно это реализуется с помощью мьютексов. В python есть модуль threading, но с его помощью мне не удалось реализовать данную задачу.
Буду очень признателен, если кто поможет.

З.Ы.
Желательно сделать это силами только питона…
ZZZ
А причём здесь мьютексы? Они служат для синхронизации потоков в одном приложении.
Это скорее средствали оси. Посмотри модуль os, может чё и накопаешь.
Кстати вопрос интетесный, так что если найдёшь – отпишись уж. Буду благодарен.
poltergeist
Обычно, такая задача решается так: в системе блокируется какой-то ресурс и при попытке второго процесса залочить этот же ресурс, он получает отказ и сваливает, хорошо если он ещё и умеет сказать ранее запущенному процессу о своём появлении… И вот насчёт ресурсов тут туговато, всё слишком системозависимо, под *nix всё просто, можно залочить файл, создать именованный канал, и всё это стандартными средствами. В windows сложнее, но тоже возможно, из стандартного есть к примеру ctypes, с помощью которого можно добраться до системных функций windows и точно также залочить файл или создать именованный канал… Второй вариант мне больше нравится.

Гугл -> первая ссылка по запросу “python windows named pipe” - > http://mail.python.org/pipermail/python-list/2005-March/314328.html
Тебе понадобится функция “windll.kernel32.CreateNamedPipeA”, про неё всё написано в MSDN
Deekin
С одного форума:
Не обязательно использовать Мьютексы, можно использовать любые именованые объекты системы… Суть механизма состоит в том, что приложение при старте пытается создать именованый объект который для системы имеет уникальный идентификатор, если объект создается - значит это первая и единственная копия данного приложения, если получаем исключение, значит приложение уже запущено, посылаем ему сообщение чтобы оно “выплыло” на передний план и закрываемся.
Литература по этой теме, которая есть в инете в основной массе написана для делфи. Какие есть там способы:
1. Использование мьютексов (основан на том, что в системе может сущестоввать только один мьютекс с заданным именем)
2. Использование заголовка окна
3. Ещё используются другие объекты с уникальным идентификатор (подобно мьютексам)
4. В С++ играются с разделяемыми переменными

В модуле os есть функция getpid(), которая возвращает идентификатор процесса, но при каждом запуске приложения ID меняется…

Есть идея попробовать создавать времнный файл при запуске и смотреть существет ли он или нет…
Deekin
poltergeist, спс
пока писал пост не увидел твоего=)
сейчас посмотрим…

идея с файлами тоже не очень нравиться…
cybergrind
ну.. могу предложить хак - открывай сокет на определенном порту. походу ни одна ос не дает открывать сокеты на одном порту дву разным програмам, и если порт занят - убивать программу
Saff
Соглашусь с Deekin,если пишешь под *nix, ИМХО лучше определять запущенную копию, по PID файлу.
ice
ну.. могу предложить хак - открывай сокет на определенном порту. походу ни одна ос не дает открывать сокеты на одном порту дву разным програмам, и если порт занят - убивать программу
Плохая идея.
ZAN
poltergeist
Обычно, такая задача решается так: в системе блокируется какой-то ресурс и при попытке второго процесса залочить этот же ресурс, он получает отказ и сваливает, хорошо если он ещё и умеет сказать ранее запущенному процессу о своём появлении…
http://mail.python.org/pipermail/python-list/2000-October/057808.html

Deekin
Использование мьютексов (основан на том, что в системе может сущестоввать только один мьютекс с заданным именем)
Готовый рецепт: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/474070
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB