可以time.sleep(secs)挂起QNetworkAccessManager异步请求吗?

时间:2014-12-21 14:55:00

标签: python qt pyqt qt-signals qtnetwork

QNetworkAccessManager可以异步执行请求,time.sleep(secs)可以暂停执行给定的秒数。我对以下代码感到困惑。这里的t2总是大于10秒吗?

在此处的代码中未使用time.sleep(secs),已完成的广告位getWebPageSRC在固定的时间内被调用,大约约3秒。

我现在已经测试了几次,发现t2总是大于10秒。任何人都可以解释原因吗?

de myMethod(self):
    ...
    reply.finished.connect(self.getWebPageSRC)
    self.t=time.clock()
    time.sleep(10)

def getWebPageSRC(self):
    t2=time.clock()-self.t
    print(t2)

P.S。由于QNAM异步地工作,我认为它在另一个线程中工作,因此有自己的事件循环,time.sleep(secs)是否暂停所有线程的所有Qt事件循环或只是它内部线程的事件循环?在主线程中休眠会挂起所有其他线程的事件循环吗?

3 个答案:

答案 0 :(得分:4)

这个问题似乎是理论,因为它应该永远不会成为实践中的一个问题,因为它闻起来像鱼腥设计或快速解决错误。

话虽如此,原因相对简单:当你开始睡觉时,Qt事件循环无法正常工作,因此在你从阻塞睡眠中醒来之前,事件循环无法从事件队列中处理你的插槽。

如果你睡在另一个线程中,这不会成为一个问题,尽管一开始就算是过于奇怪,但是在这里你睡觉的是线程(块)异步处理事件。 / p>

毕竟在Qt应用程序中睡觉没有多大意义。 Qt主要用于异步操作,尤其是像QtNetwork这样的QIODevice接口。

使用Qt 时,忘记此声明是否存在

time.sleep(10)

每当您考虑阻止等待回复时,您都可以使用同步API,尽管即使是完全同步也不公平:

# 10000 msecs = 10 secs
myNetworkReply.waitForBytesWritten(10000)

我甚至可能会更进一步:我可能会避免在python应用程序中使用Qt而不是严格的UI。也就是说,所有其余的都可以通过python方式实现,通常更好,更容易从python应用程序。我认为你应该专注于GUI,但这肯定是基于意见的。相关的替代品将是asyncore,twisted等。

答案 1 :(得分:3)

无论QNAM异步地执行其工作,它仍然在主线程中运行。停止主线程10秒也阻止了QNAM。

答案 2 :(得分:2)

QNetworkAccessManager可以异步执行请求,但它们都在应用程序主线程中执行,这是真的。所以当你打电话时

time.sleep(10)

主线程被阻止10秒,在此阻塞期间没有其他任何操作。这是因为QNetworkAccessManager不在其他帖子中。