线程只有在使用蓝牙功能时才会出现问题

Thread only has issues when it uses bluetooth function

我想设置一个线程,以便蓝牙可以在我的主程序运行时继续在后台扫描设备。 我的文件结构如下:

mainprogram.py

class MainClass():
    def something():
        mythread = threading.Thread(target=BluetoothClass.main, args=[self], daemon=True)
        mythread.start()

if __name__ == '__main__':
    start = MainClass()
    start.something()

bluetoothstuff.py

class BluetoothClass():
    def main():
        devices = bluetooth.discover_devices(lookup_names=True)

当 mainprogram.py 运行时出现此错误:

WARNING: nextEventMatchingMask should only be called from the Main Thread! This will throw an exception in the future.

如果我去掉 bluetoothstuff.py 中的蓝牙线,并插入其他东西,例如 print()time.sleep(3),它运行良好,没有错误。

在其他答案中,我看到显然当您使用蓝牙时,它 "gives up" 是主线程,但我已经尝试搜索但我仍然不确定这意味着什么。我在文件中调用了解释器是运行的线程,那不是主线程吗?

我也曾尝试在 Python 文档中搜索术语 nextEventMatchingMask,但没有找到任何结果,所以我不确定它指的是什么。

这只是一个猜测,但蓝牙不喜欢在单独的线程中调用。它会在搜索设备时导致 'deadlock'。我不明白为什么线程不会死掉,因为当我 运行 蓝牙代码本身时,它结束得很好。

无论如何,我并没有真正解决这个问题,但它仍然按照我的意愿进行。如果有人 运行 遇到了我遇到的同样愚蠢的问题,这就是发生的事情。

我只是 运行 蓝牙代码,就像您通常 运行 导入的代码一样:

mything = BluetoothClass()
mything.main()

然后我 运行 我的主程序在守护线程中。

所以蓝牙 运行 在主线程中,而主程序 运行 在单独的线程中。但它让蓝牙看起来像是在后台 运行ning 并保持 运行ning 主程序直到蓝牙中的某些东西被触发。

我将选择我自己的答案作为正确答案,因为它确实解决了我的意图。如果其他人提出更好的答案,我会重新接受它作为新答案。