如何在后台加载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 (将#修改为@)