在调用mutagen函数时,子线程冻结直到脚本结束,没有错误

时间:2013-03-08 05:35:08

标签: python multithreading

所以我正在使用python中的音乐播放器,当我初始化主窗口时,它会启动一个应该从文件中获取元数据的线程。但它只是在mutagens文件函数的第一次导入调用时停止。

当我使用python.exe直接执行脚本时,它可以正常工作。但是当我在c ++中使用本机python api来启动脚本时,调用该函数的线程会冻结。但是,我可以毫无问题地从主线程中调用该函数。

main.cpp中:

_putenv_s("PYTHONPATH", "python32.zip");

Py_Initialize();
PyRun_SimpleString("import cmw");
Py_Finalize();

cmw.py:

import meta
class MW(QtGui.QMainWindow):
    def __init__(self):
    super().__init__(None)
    ... 
    self.m = meta.Meta()
    self.m.get(lists_of_files)

meta.py:

import mutagen
class Meta:
    def __init__(self):
        self.q = Queue()
        self.lock = Lock()
        self.result = []

    def get(self, files):
        t = Thread(target=self._work)
        t.daemon = True
        t.start()

        for f in files:
             self.q.put(f)

    def _work(self):
        while True:
            f = self.q.get()
            print(1)
            meta = mutagen.File(f)
            with self.lock:
                self.result.append(meta)
            self.q.task_done()
            print("Done")

致突变物 init .py:

def File(filename, options=None, easy=False):

   print(2)
   if options is None:
       from mutagen.asf import ASF
       ... imports lots of files ...

   print(5)

Mutagens asf.py:

print(3)
... All the code ...
print(4)

输出:

1
2

程序的其余部分工作得很好。没有例外也没有。当脚本退出时

3
4
5

编辑:通过在main.cpp中将import更改为exec(open()。read())来修复它。

1 个答案:

答案 0 :(得分:0)

Okidoki。如果其他人有这个问题。见编辑