【问题标题】:Socket message sending crashSocket 消息发送崩溃
【发布时间】:2015-10-02 02:34:56
【问题描述】:

我有一系列消息通过在单独线程中运行的套接字发送。发送消息后不久,该进程的 cpu 使用率下降到几乎为零,我的主线程停止运行,它的内存分配猛增,几乎让我的计算机崩溃。

以前有人遇到过这个问题吗?你是怎么解决的?

【问题讨论】:

  • 您能否提供一些重现问题的代码作为您问题的一部分?目前,由于没有足够的细节,很难回答这个问题。
  • @matthewatabet 如果它与代码相关,我不希望任何人都必须查看所有内容。我只是想知道是否有人在尝试发送简单消息时遇到过类似的问题,如果有,他们是如何解决的。

标签: python sockets networking send packets


【解决方案1】:

我以前见过这种情况,但仅适用于大型消息。 基本上套接字上的消息有大约 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"))

【讨论】:

  • 正是我想要的那种回应!如果这是正在发生的行为,那将很有意义。你能详细说明一下 tempfile 方法吗?我对使用套接字很陌生。
  • 看来我发送的最大消息是 448 字节。
  • 啊-那不是同一个问题。除非我看到你的代码,否则不能说更多
  • @AFK 啊,我看到了你的编辑。我在客户端和服务器之间进行通信,所以我无法以这种方式使用临时文件。不幸的是,我无法在公共场所发布代码
猜你喜欢
  • 1970-01-01
  • 2013-04-24
  • 2016-11-12
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2023-03-15
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多