1

我有一个 python qt 程序,它从服务器下载许多 url。大多数网址都是小图像(图标)并且是独一无二的。

由于某些奇怪的原因,请求完成后 python/qt 仍然与服务器有一个活动的 http 连接。在我的情况下,这意味着许多 http 连接。

QT 文档指出 QNetworkAccessManager - “6 个请求针对一个主机/端口组合并行执行”。这么多、数百个 http 连接如何保持打开状态?

几分钟后,连接关闭,但如果应用程序下载太多太快,应用程序会因“(进程:3265):GLib-ERROR **:为GWakeup创建管道:打开的文件太多”而死

在finished() 信号中,我调用reply.deleteLater() 然后确保我的应用程序没有引用回复。

首先我可以捕捉到“打开的文件太多”错误并正确处理它吗?

其次,我可以防止这么多 http 连接在关闭之前保持打开状态吗?

---- 片段 ----

image_request = Qt.QNetworkRequest()
image_request.setUrl(Qt.QUrl(url))
self.image_reply = self.manager.get(image_request)
self.image_reply.finished.connect(self.image_available)

image_available 是

def image_available(self):
    if self.image_reply.error() == Qt.QNetworkReply.NoError:
        data = self.image_reply.readAll()
        img = Qt.QImage()
        img.loadFromData(data)
        self.lbl_icon.setPixmap(Qt.QPixmap(img))
        self.image_reply.deleteLater()
        self.image_reply = None
4

2 回答 2

1

经过大量调试,我发现了这个问题。

事实证明 self.manager 被覆盖了很多(意外地它应该被创建并分配一次。

self.manager = Qt.QNetworkAccessManager(self)

不止一次发生,它不应该。

现在真的有一次 QNetworkAccessManager 只有 6 个 http 连接 + 6 个 https 连接,这正是我想要的。:)

于 2013-06-12T13:47:34.763 回答
0

你的情况self.image_reply.error() == Qt.QNetworkReply.NoError总是真实的吗?如果 ts 为 false,deleteLater则不会被调用。

尝试设置“连接:关闭”标题:

image_request.setRawHeader("Connection", "close");

也尝试self.image_reply.close()手动调用。

于 2013-06-11T07:52:15.300 回答