Одно из основных применений мьютекса - гарантировать, что единственный код, который когда-либо увидит общий объект в состоянии, не удовлетворяющем его инвариантам, - это код, который (надеюсь, временно) помещает объект в это состояние. Нормальный шаблон для кода, который должен изменить объект:
Если что-то пошло не так после того, как №2 началось и до того, как №3 закончил, объект может быть оставлен в состоянии, которое не удовлетворяет его инвариантам. Поскольку правильный шаблон заключается в том, чтобы освободить мьютекс перед его удалением, тот факт, что код предоставляет мьютекс, не выпуская его, означает, что что-то пошло не так. Таким образом, может быть небезопасно вводить код в мьютекс (поскольку он не был выпущен), но нет причин ждать выхода мьютекса (поскольку - если он был удален - он никогда не будет) , Таким образом, правильный ход действий - это исключение.
Шаблон, который несколько лучше, чем тот, который реализован объектом mutex .NET, заключается в том, чтобы метод «приобретать» возвращал объект IDisposable
который инкапсулирует не мьютекс, а скорее его частное приобретение. Утилизация этого объекта приведет к отмене мьютекса. Код может выглядеть примерно так:
using(acq = myMutex.Acquire())
{
... stuff that examines but doesn't modify the guarded resource
acq.EnterDanger();
... actions which might invalidate the guarded resource
... actions which make it valid again
acq.LeaveDanger();
... possibly more stuff that examines but doesn't modify the resource
}
Если внутренний код не работает между EnterDanger
и LeaveDanger
, тогда объект сбора должен аннулировать мьютекс, вызывая Dispose
на нем, поскольку охраняемый ресурс может находиться в поврежденном состоянии. Если внутренний код выходит из строя в другом месте, мьютекс должен быть освобожден, поскольку охраняемый ресурс находится в допустимом состоянии, а код в блоке using
больше не понадобится. У меня нет каких-либо конкретных рекомендаций библиотек, реализующих этот шаблон, но это не особенно сложно реализовать в качестве обертки вокруг других видов мьютексов.
Извините, если мне чего-то не хватает, но почему сценарий .py не может быть исполняемым?
Пока в системе установлен интерпретатор Python, Вы можете запустить .py файлы из оболочки. Я не вижу необходимости для вас «запустить» скрипт.
В любом случае вы можете создать скрипт с командой, которую хотите выполнить, в этом случае:
python main.py
или
python main.py && python utility.py
для запуска более одного скрипта Python сразу.
(Всегда обращая внимание на настоящее имя интерпретатора python, присутствующего в вашей системе. Это может быть python37, python27 ...)
Возможно, в вашей конкретной проблеме есть что-то, чего я не понимаю право ...
Я рад продолжить обсуждение
.