This interesting article评估在Qt中通过信号/插槽连接传递时对象复制的频率。基本上,结果是当在C ++中通过const引用传递时,对象根本不被复制(用于直接连接)或被复制一次(用于排队连接)。
PyQt怎么样?同样举行吗?对于Python对象,在制作副本时,它是一个深层副本吗?
我主要对PyQt5和Python 3感兴趣。
答案 0 :(得分:4)
正如@ekhumoro所建议的那样,我确实尝试过,令人惊讶的是,我得到的结果与C ++中的测试结果不同。基本上,我的测试显示:对象根本不会被复制,即使使用QueuedConnection跨线程边界传递
考虑以下测试代码:
Emitting data [1] in thread <PyQt5.QtCore.QThread object at 0x7f037619f948>
Received data [1] in thread <PyQt5.QtCore.QThread object at 0x7f037619faf8>
Current data is [1]
Modified data to [1, 1]
Current data is [1, 1]
Modified data to [1, 1, 1]
Current data is [1, 1, 1]
Modified data to [1, 1, 1, 1]
Current data is [1, 1, 1, 1]
...
结果是:
data
表明尽管发送插槽和接收插槽位于不同线程,但它们共享通过QueuedConnection发送的"SELECT * FROM article WHERE type = \'lnews\' AND article_id = 1776425144629"
对象。