Что происходит, когда os.system () выполняется в потоке Python? - PullRequest
2 голосов
/ 24 июня 2019

Я новичок в потоке Python. Я пытаюсь понять, что происходит, когда os.system () вызывается из потока Python. Я понимаю, что потоки разделяют файловые дескрипторы, кучу, код и глобальные переменные. Я также читал, что os.system (cmd) создает новую подоболочку и выполняет выполняемый cmd.

У меня такой вопрос: когда потоки Python вызывают os.system (cmd), а cmd выполняет команду «./test.exe input_file.dat», выполняет ли процесс для ./test.exe что-нибудь общее (т. Е. Входные файлы, адресное пространство) , куча и т.д.) с потоками питона? Другими словами, os.system (cmd) создает новый процесс, который не имеет никакого отношения к процессу или потоку вызывающей стороны?

Ниже я предоставил код Python, который я написал.

#!/usr/bin/python

import threading
import os

semaphore = threading.Semaphore(3)

def run_command(cmd):
    with semaphore:
        os.system(cmd)

for i in range(3):
    threading.Thread(target=run_command, args=("./test.exe input_file.dat", )).start()

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Что происходит, когда os.system () выполняется в потоке Python?

  • Тема создана. Этот поток, как и все потоки, разделяет свое адресное пространство с потоком, который его создал.

  • Этот поток вызывает fork(), чтобы создать новый дочерний процесс почти точно так же, как он сам. Только дочерний процесс, вызвавший fork(), присутствует в дочернем процессе; другие темы не копируются. Дочерний процесс имеет отдельное адресное пространство от родительского процесса, но имеет память, отображенную на все те же адреса.

    (Этот дочерний процесс присутствует только в течение очень короткого времени - вы не увидите его в этом состоянии, если не предпримете определенные шаги в отладчике, чтобы приостановить процесс здесь. Использование потоков в сочетании с fork() обычно не рекомендуется , но в этом случае это в основном нормально.)

  • Новый дочерний процесс вызывает execve(), чтобы полностью заменить себя новым процессом, работающим test.exe. Адресное пространство дочернего процесса уничтожено, и для образа нового процесса создано новое.

  • Тем временем поток, вызвавший fork(), теперь вызывает waitpid() (или, возможно, wait()), чтобы приостановить его выполнение до завершения нового процесса. Как только это произойдет, os.system() вернется.

0 голосов
/ 26 июня 2019

Я нашел ответ.Когда мы выполняем os.system (cmd) из потока Python T1, новый подоболочек создается как подпроцесс T1.Поэтому test.exe разделяет адресное пространство T1 (которое в основном является адресным пространством родительского T1, кода Python).Используя pmap в Linux, мой ответ можно проверить.

Здесь я предоставляю вывод pmap для родительского процесса

Здесь я предоставляю вывод pmap для подпроцесса (test.exe)

...