#python #instance #mutex
#python #экземпляр #мьютекс
Вопрос:
Я использовал следующий рецепт, чтобы разрешить только один экземпляр моего приложения: http://code.activestate.com/recipes/474070-creating-a-single-instance-application /
В рецепте используется переменная «mutexname», которая заполняется некоторым значением мьютекса. Если я хочу создать свой собственный уникальный «мьютекс», как мне это сделать? Кроме того, как работает этот рецепт? Кто-нибудь может объяснить?
Спасибо
Ответ №1:
В рецепте используется функция win32 api CreateMutex для создания именованного мьютекса. Мьютекс является системным объектом и существует вне процесса вашего приложения. GetLastError возвращает ошибку ERROR_ALREADY_EXISTS при вызове CreateMutex с именем, которое уже существует. Рецепт проверяет это возвращаемое значение и завершает работу, если это так. Вы должны изменить рецепт, чтобы использовать другую строку для mutexname. Выберите что-то, что вряд ли будет заблокировано кем-то еще, потому что, если они это сделают, ваше приложение не сможет запуститься.
Комментарии:
1. Может ли строка иметь любое значение или длину? Кроме того, обязательно ли это должны быть символы ascii или они также могут состоять из байтов?
2. Я действительно не знаю, какое различие вы пытаетесь провести между «символами ascii» и «байтами». В Python 2.x есть два вида вещей, которые можно назвать строкой:
str
, которая на самом деле представляет собой последовательность байтов, иunicode
, которая представляет собой последовательность символов (кодовые точки Unicode). В рецепте показано использованиеstr
, поскольку Windows API по умолчанию не является Unicode. Документация Windows API дляCreateMutex
утверждений: «Имя ограничено символами MAX_PATH и может содержать любой символ, кроме символа разделителя пути с обратной косой чертой (). Сравнение имен чувствительно к регистру».3. Я использовал аналогичный код в Python 2.7, теперь с Python 3.7 я не получаю ошибку ERROR_ALREADY_EXISTS. У кого-нибудь такая же проблема?