问题描述
我正在尝试编写一个Python程序,该程序将使用RtMidi包(似乎在Cython中完成)连接到MIDI键盘。例如,运行时,此程序包需要几秒钟才能启动。 rtmidi.RtMidiIn()
。我希望它在启动时在后台运行,因为我不需要立即使用它。
我的第一次尝试是使用线程模块,即像这样的类
class Midi():
def __init__(self):
self.thread = threading.Thread(target=self.get_midi)
self.thread.start()
self._midi = None
def get_midi(self):
self._midi = rtmidi.RtMidiIn()
def midi(self):
return self._midi
midi = Midi()
do_something_while_midi_loads()
问题在于,由于使用了全局解释器锁,解释器在完成rtmidi.RtMidiIn()
之前不会越过类构造函数,这当然会破坏目的。
我尝试用multiprocess.Process
代替它,这成功克服了僵局,但是不幸的是,如果您以后尝试使用midi.midi()
,那么您会很遗憾地得到None
。这似乎与我阅读多进程模块以来的内容相符,该模块实际上仅传递对象的副本。
接下来,我尝试使用multiprocess.Queue()
对象,该对象似乎是建议使用的here,但是由于某些原因,此方法不起作用。甚至做一些简单的事情
def f(q):
q.put(rtmidi.RtMidiIn())
q = multiprocessing.Queue()
p = multiprocessing.Process(target=f,args=(q,))
p.start()
time.sleep(5) # This is long enough to ensure that RtMidiIn() has returned
print(q.empty())
不起作用;队列最后是空的-但是如果我将功能f(q)
替换为
def f(q):
q.put(None)
我这里缺少什么吗?如何无需坐下来等待就可以加载此资源?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)