代码之家  ›  专栏  ›  技术社区  ›  user1179317

Python子进程管道

  •  0
  • user1179317  · 技术社区  · 4 年前

    我只是想多了解一下 subprocess.popen pipes .主要问题是

    1. 它将管道的内容保存在哪里(内存或文件系统)?
    2. 它是否像迭代器一样,当我读取/迭代它时,这些内容会被删除?
    3. 如果我在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 ,当子流程达到该大小时,它会阻止子流程,并在读取某些内容时继续吗?

    0 回复  |  直到 4 年前