【问题标题】:How do I use the bluetooth module in conjunction with the multiprocessing module?如何将蓝牙模块与多处理模块结合使用?
【发布时间】:2018-06-23 02:50:00
【问题描述】:

我正在使用 python 3.5 和 OSX 10.13.2。

我正在尝试从蓝牙脑电图记录设备收集脑电图数据,而人类正在观看 pygame GUI。因为蓝牙设备以大约 512 Hz 的频率发送数据而 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

【问题讨论】:

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


    【解决方案1】:

    我解决了我的问题。一方面,我应该将多处理代码包装在一个 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()
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 2016-12-20
      • 2013-06-16
      • 1970-01-01
      相关资源
      最近更新 更多