Каналы подпроцессов Python

#python #subprocess #pipe #popen

#python #подпроцесс #канал #popen

Вопрос:

Я просто хотел бы иметь больше понимания с subprocess.popen and pipes . Основные вопросы

  1. Где он сохраняет содержимое канала (память или файловая система)?
  2. Действует ли он как итератор, где, когда я читаю / перебираю его, это содержимое удаляется?
  3. Если я использую bufsize в Popen, как это работает? Приостанавливает / блокирует ли он подпроцесс до тех пор, пока не будет прочитано некоторое содержимое из канала?

Например, допустим, у меня есть main.py ниже:

 import subprocess
import time


class SubprocessReader():
    def __init__(self):
        self.proc = subprocess.Popen(['python', "mysubprocess.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    def __iter__(self):
        return self

    def __next__(self):
        while True:
            line = self.proc.stdout.readline()
            if not line:
                raise StopIteration
            return line


a = SubprocessReader()
for word in a:
    print(word)
    time.sleep(0.5)
 

И mysubprocess.py содержит:

 for x in range(1000000000):
    print("writing {}".format(x))
 

Итак, в этом примере подпроцесс записывает в канал намного быстрее, поскольку родительский процесс считывает его и переходит в режим ожидания на полсекунды. Я бы подумал, что через некоторое время это займет много памяти / места. Однако я не вижу никакого дополнительного использования памяти с htop. Итак, возникает вопрос, куда сохраняется стандартный вывод / распечатка из подпроцесса? И если я удалю режим ожидания из main.py , будет ли это технически не использовать какую-либо дополнительную память / пространство? Поскольку, как только подпроцесс записывает данные в канал, основной процесс считывает его и удаляет из памяти? Так ли это работает?

И если я сделаю это в main.py вместо зацикливания

 a = SubprocessReader()
a.proc.wait()
 

Я все еще не вижу никакого увеличения объема памяти или чего-либо еще с htop. Поэтому я действительно смущен тем, где сохраняются данные.

Наконец, если я использую bufsize , будет ли он блокировать подпроцесс, когда он достигнет такого размера, и продолжится, когда часть содержимого будет прочитана?

Комментарии:

1. Каналы находятся в оперативной памяти и имеют фиксированный максимальный размер. Как только они заполнены, процесс записи блокируется до тех пор, пока не освободится место (из-за того, что процесс чтения потребляет часть данных).