Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在后台加载cython资源?_Python_Multithreading_Multiprocessing_Cython_Midi - Fatal编程技术网

Python 如何在后台加载cython资源?

Python 如何在后台加载cython资源?,python,multithreading,multiprocessing,cython,midi,Python,Multithreading,Multiprocessing,Cython,Midi,我正在尝试编写一个python程序,它将使用这个包(似乎是用Cython完成的)连接到MIDI键盘。运行时,此程序包需要几秒钟启动,例如rtmidi.rtmidin()。我希望它在启动时在后台运行,因为我不需要立即使用它 我的第一次尝试是使用线程模块,例如 class Midi(): 定义初始化(自): self.thread=threading.thread(target=self.get_midi) self.thread.start() self.\u midi=None def get_

我正在尝试编写一个python程序,它将使用这个包(似乎是用Cython完成的)连接到MIDI键盘。运行时,此程序包需要几秒钟启动,例如
rtmidi.rtmidin()
。我希望它在启动时在后台运行,因为我不需要立即使用它

我的第一次尝试是使用线程模块,例如

class Midi():
定义初始化(自):
self.thread=threading.thread(target=self.get_midi)
self.thread.start()
self.\u midi=None
def get_midi(自我):
self._midi=rtmidi.rtmidin()
def midi(自):
返回自我
midi=midi()
在midi加载时做些什么
问题是,由于全局解释器锁,解释器在
rtmidi.rtmidin()
完成之前不会经过类构造函数,这当然违背了目的

我尝试用
multiprocess.Process
替换它,它成功地克服了死锁,但不幸的是,如果您稍后尝试使用
midi.midi()
,那么您将不幸地得到
None
。这似乎与我后来读到的关于多进程模块的内容相符,该模块实际上只传递对象的副本

接下来,我尝试使用
multiprocess.Queue()
对象,这似乎是建议使用的对象,但由于某些原因,它不起作用。甚至做一些像这样简单的事情

def(q):
q、 put(rtmidi.rtmidin())
q=多处理。队列()
进程(目标=f,参数=(q,))
p、 开始()
time.sleep(5)#这足够长,可以确保rtmidin()已返回
打印(q.empty())
不起作用;队列最后是空的——但是如果我将函数
f(q)
替换为

def(q):
q、 put(无)

这里有我遗漏的东西吗?我怎么能不需要坐等就加载这个资源?< /p>从代码< RTMIDII< /Cord>看起来是一个Cython包的C++类,但是你把它当作Python对象来处理(当然不会用),这是有点困难的。但是,您可以尝试在线程版本中使用nogil:block round
rtmidi.rtmidin()。这可能行不通,在这种情况下,您必须要求包的维护人员正确标记不需要GIL的内容。如果可能的话,我想不出还有什么别的办法