Python PySide/PyQt中的安全和惰性方法调用

Python PySide/PyQt中的安全和惰性方法调用,python,thread-safety,pyqt,pyside,Python,Thread Safety,Pyqt,Pyside,我使用PySide来管理一些硬件,并根据界面中的按钮点击来执行一些相对简单的操作。运行这些硬件的代码驻留在另一个线程中。为了方便起见,我在所有这些硬件驱动程序中添加了一个通用的invoke\u方法信号,以便UI组件可以使用 my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...}) 显然,这会直接访问另一个线程中的signal属性。。。。但我不确定这在GIL的世界里是否一定可以 如果这确实是一个太懒的解决方案,那么

我使用PySide来管理一些硬件,并根据界面中的按钮点击来执行一些相对简单的操作。运行这些硬件的代码驻留在另一个线程中。为了方便起见,我在所有这些硬件驱动程序中添加了一个通用的
invoke\u方法
信号,以便UI组件可以使用

my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...})
显然,这会直接访问另一个线程中的signal属性。。。。但我不确定这在GIL的世界里是否一定可以

如果这确实是一个太懒的解决方案,那么在任意线程中调用任意方法,而不必将UI中的操作特定信号连接到驱动程序中的另一个信号,还有其他更好的选择吗

我可以想象在访问不同硬件的每一位UI代码中使用一个信号,比如
do\u invocation\u driver\u 1
do\u invocation\u driver\u 2
,并将它们连接到相应驱动程序的
invoke\u方法
信号。

使用PyQt GUI接口线程。这篇文章讨论了一个执行套接字I/O的线程,但这确实适用于任何线程。具体来说,硬件接口线程通常也使用I/O,因此这可能是一个很好的选择

讨论的方法非常通用,使用
Queue.Queue
,对于简单的任务来说似乎有些过分(但我只想在线程中调用“that”函数)。然而,一旦您的应用程序变得不平凡,您就会欣赏它,因为它避免了任何线程同步问题,并且具有很强的可伸缩性。我个人使用它来实现复杂的PyQt GUI,其中边线程执行各种操作