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

iMa*_*ath 5 python qt pyqt qtnetwork qt-signals

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)
Run Code Online (Sandbox Code Playgroud)

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

lpa*_*app 4

这个问题似乎是理论上的,因为它不应该成为实践中的一个问题,因为这听起来像是可疑的设计或错误的快速解决方法。

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

如果您睡在另一个线程中,这不会成为问题,尽管一开始会很奇怪,但在这里您睡在应该异步处理事件的线程(块)中。

毕竟,在 Qt 应用程序中休眠没有多大意义。Qt 主要用于异步操作,尤其是 QIODevice 接口,例如 QtNetwork。

使用 Qt 时请忘记此语句的存在

time.sleep(10)
Run Code Online (Sandbox Code Playgroud)

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

# 10000 msecs = 10 secs
myNetworkReply.waitForBytesWritten(10000)
Run Code Online (Sandbox Code Playgroud)

我什至可能会更进一步:除了严格的 UI 之外,我可能会避免在 Python 应用程序中使用 Qt。也就是说,其余的一切都可以通过 python 方式实现,通常通过 python 应用程序更好、更容易。我认为你应该关注 GUI,但这肯定是基于意见的。相关的替代方案是 asyncore、twisted 等。