Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2008 21:56:44

Deekin
От:
Зарегистрирован: 2008-05-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск одной копии программы

Доброго времени суток…

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

З.Ы.
Желательно сделать это силами только питона…



Офлайн

#2 Май 3, 2008 01:26:44

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Запуск одной копии программы

А причём здесь мьютексы? Они служат для синхронизации потоков в одном приложении.
Это скорее средствали оси. Посмотри модуль os, может чё и накопаешь.
Кстати вопрос интетесный, так что если найдёшь – отпишись уж. Буду благодарен.



Офлайн

#3 Май 3, 2008 11:05:25

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск одной копии программы

Обычно, такая задача решается так: в системе блокируется какой-то ресурс и при попытке второго процесса залочить этот же ресурс, он получает отказ и сваливает, хорошо если он ещё и умеет сказать ранее запущенному процессу о своём появлении… И вот насчёт ресурсов тут туговато, всё слишком системозависимо, под *nix всё просто, можно залочить файл, создать именованный канал, и всё это стандартными средствами. В windows сложнее, но тоже возможно, из стандартного есть к примеру ctypes, с помощью которого можно добраться до системных функций windows и точно также залочить файл или создать именованный канал… Второй вариант мне больше нравится.

Гугл -> первая ссылка по запросу “python windows named pipe” - > http://mail.python.org/pipermail/python-list/2005-March/314328.html
Тебе понадобится функция “windll.kernel32.CreateNamedPipeA”, про неё всё написано в MSDN



Офлайн

#4 Май 3, 2008 11:12:48

Deekin
От:
Зарегистрирован: 2008-05-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск одной копии программы

С одного форума:

Не обязательно использовать Мьютексы, можно использовать любые именованые объекты системы… Суть механизма состоит в том, что приложение при старте пытается создать именованый объект который для системы имеет уникальный идентификатор, если объект создается - значит это первая и единственная копия данного приложения, если получаем исключение, значит приложение уже запущено, посылаем ему сообщение чтобы оно “выплыло” на передний план и закрываемся.
Литература по этой теме, которая есть в инете в основной массе написана для делфи. Какие есть там способы:
1. Использование мьютексов (основан на том, что в системе может сущестоввать только один мьютекс с заданным именем)
2. Использование заголовка окна
3. Ещё используются другие объекты с уникальным идентификатор (подобно мьютексам)
4. В С++ играются с разделяемыми переменными

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

Есть идея попробовать создавать времнный файл при запуске и смотреть существет ли он или нет…



Офлайн

#5 Май 3, 2008 11:16:54

Deekin
От:
Зарегистрирован: 2008-05-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск одной копии программы

poltergeist, спс
пока писал пост не увидел твоего=)
сейчас посмотрим…

идея с файлами тоже не очень нравиться…



Офлайн

#6 Май 3, 2008 13:19:58

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск одной копии программы

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



Офлайн

#7 Май 3, 2008 20:58:16

Saff
От:
Зарегистрирован: 2008-03-18
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск одной копии программы

Соглашусь с Deekin,если пишешь под *nix, ИМХО лучше определять запущенную копию, по PID файлу.



Офлайн

#8 Май 4, 2008 09:22:03

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск одной копии программы

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



Офлайн

#9 Май 4, 2008 11:22:31

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Запуск одной копии программы

poltergeist
Обычно, такая задача решается так: в системе блокируется какой-то ресурс и при попытке второго процесса залочить этот же ресурс, он получает отказ и сваливает, хорошо если он ещё и умеет сказать ранее запущенному процессу о своём появлении…
http://mail.python.org/pipermail/python-list/2000-October/057808.html

Deekin
Использование мьютексов (основан на том, что в системе может сущестоввать только один мьютекс с заданным именем)
Готовый рецепт: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/474070



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version