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

时间:2018-01-14 04:13:57

标签: macos concurrency bluetooth python-3.5 python-multiprocessing

我正在使用python 3.5和OSX 10.13.2。

当人正在观看pygame GUI时,我正试图从蓝牙EEG录制设备收集EEG数据。因为蓝牙设备以大约512Hz发送数据并且pygame GUI以大约25Hz更新,我认为包括收集蓝牙数据和在相同的循环/过程中更新GUI是不合适的。

因此,我想创建两个并发进程:一个用于收集蓝牙输入,另一个用于显示/更新pygame GUI。我想我已经想出了如何在一个单独的进程中运行pygame窗口,但是使用连接到我的蓝牙设备并从中读取输入的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

1 个答案:

答案 0 :(得分:0)

我解决了我的问题。首先,我应该将多处理代码包装在if语句中,如下所示。二,我应该将start方法设置为'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()