如何将蓝牙模块与多处理模块结合使用?

How do I use the bluetooth module in conjunction with the multiprocessing module?

我正在使用 python 3.5 和 OSX 10.13.2。

我正在尝试在人类观看 pygame GUI 时从蓝牙 EEG 记录设备收集 EEG 数据。因为蓝牙设备以大约 512 Hz 的频率发送数据而 pygame GUI 以大约 25Hz 的频率更新,所以我认为在同一个 loop/process 中包括蓝牙数据的收集和 GUI 的更新是不合适。

因此,我想创建两个并发进程:一个用于收集蓝牙输入,一个用于 displaying/updating pygame GUI。我想我已经想出了如何在一个单独的进程中 运行 a pygame window,但是使用 multiprocessing 模块创建一个单独的进程,该模块连接到我的输入并从中读取输入蓝牙设备运行不正常。

当我运行下面的代码时,执行似乎停在这一行socket.connect(('B0:B4:48:F6:38:A1', 1))connect()方法中没有任何内容被打印出来。这是 Mac OSX、蓝牙模块、Python 或其他问题吗?有谁知道我该如何解决这个问题?如果没有,有没有人有不同的方法来解决我最初从蓝牙设备收集数据并使用 python 3.5 并行更新 GUI 的问题?

import multiprocessing, time, bluetooth

def connect():
    socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
    try:
        socket.connect(('B0:B4:48:F6:38:A1', 1))
        print("connected to device!!")
    except Exception as e:
        print("failed to connect :(")


def wait_and_do_nothing():
    print("just sleeping over here in this process")
    time.sleep(5)

process1 = multiprocessing.Process(target=connect, args=())
process2 = multiprocessing.Process(target=wait_and_do_nothing, args=())

process1.start()
process2.start()

process1.join()
process2.join()

print("finished")

以上代码的输出为: finished

我解决了我的问题。首先,我应该将多处理代码包装在如下所示的 if 语句中。第二,我应该将启动方法设置为 'spawn' 而不是 'fork' ,就像我在下面做的那样:

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn', force=True)

    process1 = multiprocessing.Process(target=connect, args=())
    process2 = multiprocessing.Process(target=wait_and_do_nothing, args=())

    process1.start()
    process2.start()

    process1.join()
    process2.join()