Как создать мьютекс для приложения Python с одним экземпляром

#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. У кого-нибудь такая же проблема?