Python QT QNetworkRequest以“(进程:3265):GLib-ERROR **:为GWakeup创建管道:太多打开的文件”退出

时间:2013-06-11 06:53:57

标签: python qt http networking pyqt4

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

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

QT文档指出QNetworkAccessManager - “6个请求是为一个主机/端口组合并行执行的。”怎么可以保持这么多,几百个http连接?

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

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

首先,我可以捕获“打开文件太多”错误并正确处理吗?

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

---- Snippets ----

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

2 个答案:

答案 0 :(得分:1)

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

事实证明,self.manager被覆盖了很多(不小心它应该被创建并分配一次。

self.manager = Qt.QNetworkAccessManager(self)

发生了不止一次而且不应该。

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

答案 1 :(得分:0)

你的情况self.image_reply.error() == Qt.QNetworkReply.NoError总是如此吗?如果为假,则不会调用deleteLater

尝试设置'连接:关闭'标题:

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

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