#python #subprocess #pipe #popen
#python #подпроцесс #канал #popen
Вопрос:
Я просто хотел бы иметь больше понимания с subprocess.popen
and pipes
. Основные вопросы
- Где он сохраняет содержимое канала (память или файловая система)?
- Действует ли он как итератор, где, когда я читаю / перебираю его, это содержимое удаляется?
- Если я использую 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. Каналы находятся в оперативной памяти и имеют фиксированный максимальный размер. Как только они заполнены, процесс записи блокируется до тех пор, пока не освободится место (из-за того, что процесс чтения потребляет часть данных).