PySide/PyQt中的安全和延迟方法调用
我正在使用PySide来管理一些硬件,并根据界面中的按钮点击执行一些相对简单的操作。每个硬件的运行代码都在另一个线程中。为了方便起见,我给所有这些硬件驱动程序添加了一个通用的 invoke_method
信号,这样界面组件就可以使用它。
my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...})
显然,这样直接访问了另一个线程中的信号属性……但我不确定在全局解释器锁(GIL)的环境下这样做是否合适。
如果这确实是个太懒的解决方案,那有没有其他好的方法可以在不同的线程中调用任意方法,而不需要在界面中为每个操作特定的信号连接到驱动程序中的另一个信号呢?
我可以想象在每个UI代码中使用一个信号来访问不同的硬件,比如 do_invocation_driver_1
和 do_invocation_driver_2
,然后将这些信号连接到相应驱动程序的 invoke_method
信号。
1 个回答
4
我建议你看看这篇文章,里面讲的是如何把线程和PyQt图形界面结合起来。虽然文章主要讨论的是一个处理网络连接的线程,但其实这个方法适用于任何线程。特别是那些和硬件打交道的线程,通常也会涉及输入输出,所以这个方法可能很合适。
文章中提到的方法很通用,使用了Queue.Queue
,对于简单的任务来说,可能看起来有点复杂(比如我只是想在一个线程里调用“那个”函数)。不过,当你的应用变得复杂时,你会发现这个方法的好处,因为它能避免任何线程之间的同步问题,而且非常灵活。个人来说,我用这个方法实现了复杂的PyQt图形界面,同时还有其他线程在做各种事情。