当前位置: 首页 > 面试题库 >

PyQt应用程序中的线程:使用Qt线程还是Python线程?

钱峻
2023-03-14
问题内容

我正在编写一个GUI应用程序,该应用程序通过Web连接定期检索数据。由于此检索需要一段时间,因此这会导致UI在检索过程中无响应(无法拆分成较小的部分)。这就是为什么我想将Web连接外包给一个单独的工作线程。

[是的,我知道,现在我有两个问题。]

无论如何,该应用程序使用PyQt4,所以我想知道更好的选择是:使用Qt的线程还是使用Python threading模块?各自的优点/缺点是什么?还是您有完全不同的建议?

尽管在我的特定情况下,解决方案可能会使用非阻塞网络请求,例如Jeff Ober和LukášLalinský建议的(所以基本上将并发性问题留给了网络实现),但我仍然希望深入回答一般问题:

与本地Python线程(来自threading模块)相比,使用PyQt4(即Qt)线程有什么优缺点?

编辑2:谢谢大家的回答。尽管没有达成100%的协议,但似乎普遍的共识是答案是“使用Qt”,因为这样做的优点是与库的其余部分集成在一起,而没有造成真正的不利。

对于希望在这两种线程实现之间进行选择的任何人,我强烈建议他们阅读此处提供的所有答案,包括方丈链接到的PyQt邮件列表线程。

我考虑了一些悬赏的答案;最后,我选择了方丈作为非常相关的外部参考。然而,这是一个密切的电话。

再次感谢。


问题答案:

大致相同。主要区别在于QThreads与Qt(异步信号/插槽,事件循环等)更好地集成在一起。另外,您不能在Python线程中使用Qt(例如,不能通过QApplication.postEvent将事件发布到主线程):您需要一个QThread才能工作。

一般的经验法则是,如果您要以某种方式与Qt进行交互,则可以使用QThreads;否则,请使用Python线程。

PyQt的作者对此问题也发表了一些较早的评论:“它们都是相同的本机线程实现的包装器”。两种实现都以相同的方式使用GIL。



 类似资料:
  • 我更喜欢编写我的应用程序,甚至不考虑图形用户界面。一旦应用程序代码正常工作,我喜欢在它上面粘合一个图形用户界面层——两者之间有一个干净的界面。 我首先尝试让GUI在不同于应用程序的进程中运行。但是我很快就后悔了那个实验。在两个进程之间建立通信链路绝非小事。所以我决定现在,多线程是可以的(尽管Python全局解释器锁使它们在单个核心上运行)。 主线程完全掌握在QtGUI手中。显然,这是标准做法。因此

  • 问题内容: Scrapy中很少有并发设置,例如CONCURRENT_REQUESTS。这意味着Scrapy搜寻器是多线程的吗?因此,如果我运行它,将在字面上并行触发多个同时请求?我问是因为,我读过Scrapy是单线程的。 问题答案: Scrapy是单线程的,除了交互式外壳程序和一些测试之外,请参见source。 它建立在Twisted的基础上,Twisted也是单线程的,并且利用了它自己的异步并发

  • 还有,我应该什么时候关闭executor服务? 我是新的纺纱线程这种方式,有人能帮助我了解它是如何工作的吗?

  • 当我创建一个简单的非多线程JavaFX应用程序并启动它时,该应用程序会创建一些线程(JavaFXApplicationThread、JavaFXLauncher等)。这些线程中的大多数都已命名,但在我的所有JavaFX应用程序中都有一个未命名的线程(“线程-1”或“线程-2”)。我绝对不会创建自己的线程,因为我尝试启动Hello World JavaFX应用程序(由IDEA生成),其中也包含“线程

  • 本文向大家介绍PyQt 线程类 QThread使用详解,包括了PyQt 线程类 QThread使用详解的使用技巧和注意事项,需要的朋友参考一下 PyQt中的线程类 QtCore.QThread ,使用时继承QThread类 启动界面的线程暂称为UI线程。界面执行命令时都在自己的UI线程中。 如果在UI线程中执行网络连接和数据库操作等耗时的操作,界面会被卡住,Windows下有可能会出现“无响应”的

  • 下面的代码片段给我错误< code >不在FX应用程序线程上;当前线程 = < code > Java FX < code >应用程序线程。这个应用程序在java 1.7中运行良好,但是当我把它移到fx8时,它现在出现错误。当我第一次尝试启动应用程序时,它按预期工作。但是在关闭并再次打开舞台后,它不起作用了。 错误也不明确。如果当前线程是fx应用程序线程,那么不在fx应用线程上意味着什么。