如何解决如何在后台加载cython资源?
我正在尝试编写一个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 举报,一经查实,本站将立刻删除。