Python windows process running

Класс Process() модуля multiprocessing в Python.

Создание отдельного процесса, запуск задачи и получение результата выполнения.

Синтаксис:

Параметры:

Конструктор всегда следует вызывать с ключевыми аргументами.

  • group=None — не используется модулем,
  • target=None — вызываемый объект (функция),
  • name=None — имя процесса,
  • args=() — аргументы для target ,
  • kwargs=<> — ключевые аргументы для target ,
  • daemon=None — флаг для демонизации процесса.

Возвращаемое значение:

Описание:

Класс Process() модуля multiprocessing запускает вызываемый объект target на исполнение, который будет выполняется в отдельном процессе/ядре процессора.

Есть два способа запустить какое либо действие:

  • Передать вызываемый объект (функцию) target в конструктор.
  • Переопределить метод Process.run() в подклассе.

Внимание! Никакие другие методы не должны переопределяться в подклассе (кроме конструктора). Другими словами, можно переопределять только методы __init__() и Process.run() этого класса.

Объект Process имеет эквиваленты всех методов объекта Thread() .

Аргумент group всегда должна быть None ; он существует исключительно для совместимости с классом threading.Thread() .

Аргумент target — это вызываемый объект, который будет вызываться методом Process.run() . По умолчанию это None , что означает, что ничего не вызывается. По умолчанию в вызываемый объект target не передаются его аргументы.

Аргумент name — это имя процесса, подробнее смотрите атрибут Process.name .

Аргумент args — это кортеж аргументов для целевого вызова target . Аргумент kwargs — это словарь ключевых аргументов для целевого вызова target .

Если предоставлен ключевой аргумент daemon , то он устанавливает флаг демона процесса значение True или False . Если daemon=None (по умолчанию), этот флаг будет унаследован от процесса создателя.

Если подкласс переопределяет конструктор класса multiprocessing.Process() , то необходимо вызывать конструктор базового класса Process.__init__() , прежде чем делать что-либо еще с процессом.

Обратите внимание, что методы Process.start() , Process.join() , Process.is_alive() , Process.terminate() и Process.exitcode должны вызываться только процессом, создавшим этот объект процесса.

Методы объекта Process .

Объекты Process представляют собой действия, которые выполняются в отдельном процессе.

Process.run() :

Метод Process.run() представляет активность процесса.

Можно переопределить этот метод в своем подклассе. Стандартный метод Process.run() вызывает вызываемый объект, переданный конструктору в качестве целевого аргумента target , с позиционными и ключевыми аргументами, взятыми из аргументов args и kwargs соответственно.

Метод Thread.run() можно переопределить в пользовательском подклассе. Например:

Process.start() :

Метод Process.start() запускает экземпляр Process в отдельном процессе/ядре процессора.

Этот метод должен быть вызван не более одного раза для каждого объекта процесса. Он организует вызов метода Process.run() объекта в отдельном процессе/ядре процессора.

Дополнительно, смотрите описание этого метода у объекта Thread , примеры кода аналогичны.

Process.join([timeout]) :

Метод Process.join() ждет, пока не завершится процесс.

Если необязательный аргумент timeout=None (по умолчанию), то процесс, из которого вызван этот метод, блокируется до тех пор, пока не завершится процесс, у которого вызван этот метод. Проще говоря, если вызвать метод Process.join() для создаваемых процессов из основного процесса программы, то дальнейшее выполнение программы будет заблокировано, пока созданные процессы не завершаться.

Если тайм-аут timeout является положительным числом, то процесс блокируется не более чем на величину секунд, указанную в timeout . Обратите внимание, что метод возвращает None , если его процесс завершается или если время ожидания метода истекает. Проверьте код выхода процесса Process.exitcode , чтобы определить, завершился ли он.

К процессу можно присоединяться много раз.

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

Дополнительно, смотрите описание этого метода у объекта Thread , примеры кода аналогичны.

Читайте также:  Manjaro linux разбивка диска

Process.name :

Атрибут Process.name это имя процесса и представляет собой строку, которая используется только для идентификации. У имени нет семантики.

Несколько процессов могут иметь одно и то же имя (можно присваивать).

Начальное имя задается конструктором класса. Если в конструктор не передан аргумент name , то имена порожденных процессов будет выглядеть как «Process-N1:N2. Nk», где каждый Nk является N-м потомком своего родителя.

Дополнительно, смотрите описание этого метода у объекта Thread , примеры кода аналогичны.

Process.is_alive() :

Метод Process.is_alive() проверяет, является ли процесс живым.

Грубо говоря, объект процесса является живым с момента вызова метода Process.start() и до завершения порожденного дочернего процесса.

Process.daemon :

Атрибут Process.daemon флаг демона процесса, логическое значение. Этот атрибут должен быть установлен перед вызовом метода Process.start() .

Начальное значение наследуется от процесса создателя.

Когда процесс завершается, он пытается завершить все свои демонические дочерние процессы.

Обратите внимание, что демоническому процессу не разрешается создавать дочерние процессы. Так как если демонический процесс будет прерван выходом из родительского процесса, то демонический процесс оставил бы свои дочерние процессы «сиротами«. Кроме того, это не демоны или службы Unix, это обычные процессы, которые будут завершены (но не присоединены), если завершились не-демонические процессы.

Process.pid :

Атрибут Process.pid возвращает идентификатор процесса. До того, как процесс будет порожден, это будет None .

Process.exitcode :

Атрибут Process.exitcode возвращает код выхода порожденного процесса. Значение будет None , если процесс еще не завершен.

Отрицательное значение -N указывает, что дочерний элемент был прерван сигналом N .

Process.authkey :

Атрибут Process.authkey ключ аутентификации процесса, представляет из себя байтовую строку.

При инициализации модуля multiprocessing , основному процессу присваивается случайная строка с помощью os.urandom() .

Когда создается объект процесса, то он наследует ключ аутентификации своего родительского процесса, хотя это может быть изменено путем установки атрибута authkey в другую байтовую строку.

Process.sentinel :

Атрибут Process.sentinel числовой дескриптор системного объекта, который станет «готовым» по завершении процесса.

Можно использовать это значение, если необходимо дождаться нескольких событий одновременно, используя multiprocessing.connection.wait() . Вообще это проще сделать вызвав метод Process.join() у каждого из создаваемых процессов, результатов которых надо дождаться.

В Windows это дескриптор ОС, который можно использовать с семейством вызовов API WaitForSingleObject и WaitForMultipleObjects . В Unix это файловый дескриптор, который можно использовать с примитивами из модуля select .

Process.terminate() :

Метод Process.terminate() завершает процесс. В Unix это делается с помощью сигнала SIGTERM , в Windows используется TerminateProcess() .

Обратите внимание, что обработчики выхода, предложения tru/finally и т. д. не будут выполняться.

Python windows process running

Process is a program that is being executed (processed). A process may not have to be one ran explicitly by the user, it could be a system process spawned by the operating system. Any applications that execute on an operating system firstly creates a process of its own to execute. In a typical os installation, most processes are os services and background applications, that are ran to maintain the operating system, software, and hardware. In this article, we will take a look at different ways of terminating running processes on a Windows OS, through python. Firstly we would describe a python method to achieve the result and then would look at a command found in Windows Command Processor for the equivalent effect.

NOTE: This method is exclusive to Windows Operating systems. To achieve a similar effect on Linux, macOS refer to Kill command in Linux

Precautions

Terminating a concurrently running process should be done appropriately and with a conscience. As terminating a necessary process (ex. svhost, System, Windows Explorer, Antimalware Service Executable) could lead to inconsistency in operating system functionality, which could consequently lead to system crashes, blue screen of death, software malfunctioning, etc. Therefore it is generally advised to double-check the name of the applications/PID that is to be terminated beforehand.

Читайте также:  Linux вывести одну строку

Method 1:

Firstly, we would be using the wmi library for getting the list of the running process, and later would use this list to search for our desired process, and if found would terminate it. In order to install the module, execute the following command in the command interpreter of your operating system:

Code:

Python3

Explanation:

Firstly, we define a variable storing an integer value, which would serve to tell whether the process got terminated or not. This variable could also be used to determine how many processes under the same name have been terminated. Then, we specify the name of the process which we are willing to terminate. After which we initialize the WMI() class of wmi library. This allows us to use the methods found inside it such as WMI.Win32_Service, WMI.Win32_Process etc which are designed to perform different tasks. We would be using the WMI.Win32_Process function to get the list of running processes as wmi objects. Then we use the name attribute of the wmi object to the get name of the running process. After which we would be using primitive string matching to determine whether the name of the application matches the one specified before. If it does then we call the Terminate() method, to kill/terminate the process. After which we increment the value of ti, where the incremented value (or any non 0 value) would signify that at least one process has been terminated. After the end of the loop (when all the running processes names have been checked), we would check whether the value of variable ti is still 0 or not. If it is then no process got terminated, and we inform the user about the same using an Error message.

Method 2:

Now we would be using an inbuilt utility found inside the windows command processor named WMIC (Windows Management Instrumentation Command-Line) to terminate the running process. The command we would be using :

Python. Урок 24. Потоки и процессы в Python. Часть 3. Управление процессами

Продолжаем изучать параллельное программирование на Python. На этот раз разберемся с тем как создавать процессы, управлять завершением их работы и изучим особенности процессов-демонов.

Процессы в Python

Процессы в Python позволяют запустить выполнение нескольких задач в параллельном режиме. По сути, при старте процесса запускает еще одна копия интерпретатора Python , в котором выполняется указанная функция. Таким образом, если мы запустим пять процессов, то будет запущено пять отдельных интерпретаторов, в этом случае уже не будет проблем с GIL . Такой способ позволяет параллельно запускать задачи активно использующие CPU . Они будут распределяться между несколькими процессами (ядрами), что значительно увеличит производительность вычислений.

Класс Process

Классом, который отвечает за создание и управление процессами является Process из пакета multiprocessing . Он совместим по сигнатурам методов и конструктора с threading . Thread , это сделано для более простого перехода от многопотокового приложения к многопроцессному. Помимо одноименных с Thread методов, класс Process дополнительно предоставляет ряд своих. Познакомимся поближе с этим классом, конструктор класса выглядит следующим образом:

class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs=<>, *, daemon=None)

  • group
    • Параметр всегда равен None , используется для обратной совместимости с Thread .
  • target
    • Сallable -объект, который будет вызван методом run() при старте процесса.
  • name
    • Имя процесса.
  • args
  • kwargs
    • Параметры объекта, переданного через target .
  • daemon
    • Флаг, определяющий является ли данный процесс демоном ( True ) или нет ( False ). Если значение не задано, то оно будет равно свойству daemon родительского процесса.

Помимо методов и свойств, которые совпадают по назначению с аналогичными для класса Thread , класс Process имеет ряд уникальных:

  • pid
    • Возвращает ID процесса. Если процесс ещё не запущен, то вернет None .
  • exitcode
    • Код возврата. Если процесс ещё не завершил свою работу, то вернет None .
  • authkey
    • Ключ аутентификации процесса. При инициализации multiprocessing, с главным процессом связывается специальная строка, которая генерируется с помощью os.urandom() . Это значение наследуют процессы-потомки, но его можно изменить, задав новое значение, через данное свойство.
  • sentinel
    • Числовой идентификатор, который может использоваться для синхронизации. Подробно об этом будет написано в одном из следующих уроков.
  • close()
    • Освобождает все ресурсы, связанные с процессом. Если процесс еще работает, то вызов метода приведет к выбросу исключения ValueError .
Читайте также:  Windows cannot open the required file d sources install wim что это

Создание и ожидание завершения работы процессов

Как уже было сказано выше, за организацию работы с процессами в Python отвечает класс Process . Для запуска процесса используется метод start() . Разберем простой пример:

В рамках данного примера мы написали функцию (строка 4), которая будет выполнена в отдельном процессе, в главном процессе мы создали переменную типа Process (строка 10) с указанием функции func , и запустили его (срока 11). В результате в консоли будут выведены два сообщения из родительского и дочернего процессов:

За ожидание завершения работы процесса(ов) отвечает метод join , со следующей сигнатурой:

При вывозе метода join() выполнение программы будет остановлено до тех пор пока соответствующий процесс не завершит работу. Параметр timeout отвечает за время ожидания завершения работы процесса, если указанное время прошло, а процесс еще не завершился, то ожидание будет прервано и выполнение программы продолжится дальше. В случае, если метод join() завершился по таймауту или в результате того, что процесс был завершен аварийно (терминирован), то он вернет None .

Если в приведенном выше примере код главного процесса заменить на следующий:

То в консоли сообщения будут выведены в таком порядке:

Это происходит потому, что строка print(“Goodbye”) из основного процесса выполняется раньше, чем print(“Hello from child Process”) из дочернего. Для того, чтобы все было выведено в нужном порядке, воспользуемся методом join() :

Для проверки того выполняется процесс сейчас или нет используется метод is_alive() . Дополним наш пример соответствующими проверками:

Создание классов-наследников от Process

В классе наследнике от Process необходимо переопределить метод run() для того, чтобы он (класс) соответствовал протоколу работы с процессами. Ниже представлен пример с реализацией этого подхода.

Мы создали класс CustomProcess , который является наследником от Process и переопределили метод run() , так, что он выводит заданное количество сообщений, которое задается при создании объекта, с интервалом в 500 мс. Запуск процесса осуществляется с помощью метода start() .

Принудительное завершение работы процессов

В отличии от потоков, работу процессов можно принудительно завершить, для этого класс Process предоставляет набор методов:

  • terminate()
    • Принудительно завершает работу процесса. В Unix отправляется команда SIGTERM , в Windows используется функция TerminateProcess() .
  • kill()
    • Метод аналогичный terminate() по функционалу, только вместо SIGTERM в Unix будет отправлена команда SIGKILL .

Процессы-демоны

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

Указание на то, что процесс является демоном должно быть сделано до его запуска (до вызова метода start()) . Для демонического процесса запрещено самостоятельно создавать дочерние процессы. Эти процессы не являются демонами (сервисами) в понимании Unix , единственное их свойство – это завершение работы вместе с родительским процессом.

Указать на то, что процесс является демоном можно при создании экземпляра класса через аргумент daemon , либо после создания через свойство daemon .

При запуске данной программы на консоли должно появиться следующее:

P.S.

Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.

Оцените статью