如何将蓝牙模块与多处理模块结合使用?
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()
我正在使用 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()