我通过在单独线程中运行的套接字发送了一系列消息。在发送消息后的短时间内,进程中的cpu使用率几乎没有下降,我的主线程停止运行,并且其内存分配飙升几乎使我的计算机崩溃。
之前有没有人遇到过这个问题?你是如何修理它的?
答案 0 :(得分:0)
之前我见过这个,但仅限于大型消息。 基本上,套接字上的消息具有大约65,000字节(2 ^ 16)的限制
因此,核心Linux操作系统存在这种限制,它不允许套接字PIPE一次进行多次通信。如果确实发送了更多限制数据,则套接字元信息被覆盖,父线程失去"子线程 - 而且它不知道它丢失了子线程!因此,它一直在等待子线程向它发送某种信息。
这会使父线程挂起并且您的子线程不断发送信息 - 这会耗尽您的记忆。
避免这种情况的方法是使用临时文件从一侧向另一侧发送信息。
我不太确定你的代码是怎样的,所以我在解释我在用例中如何使用tempfiles。
因此,由于套接字管道有限制,显而易见的选择是使用其他方法将消息从一个进程传输到另一个进程。当我遇到这个时,我试图在孩子和父母的过程之间进行交流。
我这样做的方式是:
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"))