我只是想多了解一下
subprocess.popen
和
pipes
.主要问题是
-
它将管道的内容保存在哪里(内存或文件系统)?
-
它是否像迭代器一样,当我读取/迭代它时,这些内容会被删除?
-
如果我在Popen中使用bufsize,它是如何工作的?它是否会暂停/阻止子流程,直到读取管道中的某些内容?
例如,假设我有
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有任何额外的内存使用。因此,问题出现了,子进程中的stdout/打印输出保存到哪里?如果我从main.py中删除sleep,从技术上讲,它不会使用任何额外的内存/空间吗?因为一旦子进程写入管道,主进程就会读取它并将其从内存中删除?事情就是这样吗?
如果我在main.py而不是循环中执行此操作
a = SubprocessReader()
a.proc.wait()
我仍然没有看到htop的记忆力有任何提高。所以我真的很困惑数据保存在哪里。
最后,如果我使用
bufsize
,当子流程达到该大小时,它会阻止子流程,并在读取某些内容时继续吗?