我以前见过这种情况,但仅适用于大型消息。
基本上套接字上的消息有大约 65,000 字节(2^16)的限制
因此,在核心 linux 操作系统中存在这个限制,它不允许套接字 PIPE 一次进行超过此范围的通信。如果它确实发送了超过限制的数据,则套接字元信息将被覆盖,并且父线程“丢失”子线程 - 而且它不知道它丢失了子线程!所以,它一直在等待子线程向它发送某种信息。
这会使父线程挂起,而您的子线程继续发送信息 - 这会占用您的内存。
避免这种情况的方法是使用临时文件将信息从一侧发送到另一侧。
关于前面提到的tempfile方法:
我不太清楚你的代码是怎样的,所以我解释一下我是如何在我的用例中使用临时文件的。
因此,由于套接字管道有一个限制,显而易见的选择是使用其他方法将消息从一个进程传输到另一个进程。当我遇到这个时,我试图在子进程和父进程之间进行通信。
我的做法是:
import subprocess
process = subprocess.Popen(["some_command"], stdout=subprocess.PIPE)
process.wait()
print(process.stdout.readlines())
现在,当我得到错误时,我使用了一个临时文件,在 python 中使用 tempfile 模块,如下所示:
import subprocess
stdout_file = tempfile.TemporaryFile()
process = subprocess.Popen(["some_command"], stdout=stdout_file)
process.wait()
stdout_file.seek(0)
print(stdout_file.read().decode("utf-8", "ignore"))