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)
附言由于 QNAM 异步执行其工作,我认为它在另一个线程中工作,因此有自己的事件循环,所以 time.sleep(secs) 是否暂停所有线程的所有 Qt 事件循环或仅暂停它所在线程的事件循环?在主线程中休眠是否会暂停所有其他线程的事件循环?
最佳答案
这个问题似乎是理论上的,因为它在实践中永远不应该是一个问题,因为它闻起来像可疑的设计或错误的快速解决方法。
话虽如此,原因相对简单:当您开始 sleep 时,Qt 事件循环无法完成其工作,因此在您从阻塞 sleep 中醒来之前,事件循环无法从事件队列中处理您的槽。
如果您在另一个线程中休眠,这将不是问题,尽管一开始这会过于奇怪,但在这里您在本应异步处理事件的线程( block )中休眠。
毕竟在 Qt 应用程序中休眠没有多大意义。 Qt 主要用于异步操作,尤其是像 QtNetwork 这样的 QIODevice 接口(interface)。
在使用Qt的时候,忘记这个语句的存在:
time.sleep(10)
每当您考虑阻止以等待回复时,您都可以使用同步 API,尽管公平地说,即使那样也不是完全同步:
# 10000 msecs = 10 secs
myNetworkReply.waitForBytesWritten(10000)
我什至可能会走得更远:我可能会避免在 Python 应用程序中将 Qt 用于除 UI 之外的任何其他用途。也就是说,所有其余的都可以通过 python 方式实现,通常从 python 应用程序中更好更容易。我认为您应该关注 GUI,但这肯定是基于意见的。相关的替代方案是 asyncore、twisted 等。
关于python - time.sleep(secs) 可以暂停 QNetworkAccessManager 异步请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27590512/