我正在使用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
答案 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()