python - time.sleep(secs) 可以暂停 QNetworkAccessManager 异步请求吗?

标签 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)

附言由于 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/

相关文章:

android - 无论小部件结构如何,如何确保按钮关闭应用程序?

python - 转换 QObject 子类实例

python - 正则表达式去除字符串空格

python - Python 列表切片与 R 向量切片

python - 为什么这个脚本需要这么长时间才能运行?

c++ - 如何将菜单栏添加到窗口框架中? [使用 C++ 的 QT]

c++ - 如何在 Qt 中设计滑动/滑动功能来选择小部件?

python - Pyqt5 查找 QlistWidgetItem 的行

python - PyQT 窗口 : I want to remember the location it was closed at

map 上的 Python 多处理