0

背景:我正在创建一个包含人脸识别的 tkinter 项目。因为import face_recognition, cv2需要很长时间,为了更方便,这已经放在一个线程中(我知道 tkinter 不喜欢线程,但它们非常有用)。例如

import tkinter
def thread_import ():
    global face_recognition, cv2
    import face_recognition, cv2
if __name__ == '__main__':
    threading.Thread (target = thread_import).start ()

我的问题是有没有办法降低进口的影响。由于线程占用 CPU 时间,我的 tkinter 窗口可能无法响应。我不介意它是否需要更长的时间,但我真的不想进入所有库文件来添加time.sleep (x).

提前谢谢了。

4

1 回答 1

0

非常感谢@TerryJanReedy 对 GIL 的评论。基于此,我设置了一个multiproccessing.Process对象,并通过一个对象传递了必要的值multiprocessing.Manager。一个示例实现如下所示:

import multiprocessing, time

def thread_manager (manager):
    import face_recognition, cv2
    while not manager ["closing"]:
        if manager ["com"] == 0: time.sleep (0.2)
        else:
            if manager ["com"] == 1: manager ["rtn"] = "Example return."
            manager ["com"] = 0

if __name__ == "__main__":
    manager = multiprocessing.Manager ().dict ({"com" : 0, "closing" : False, "rtn" : None})
    p = multiprocessing.Process (target = thread_manager, args = (manager,))
    p.start ()
    time.sleep (5)
    manager ["com"] = 1
    while manager ["rtn"] == None: time.sleep (0.2)
    print (manager ["rtn"])
    manager ["closing"] = True
于 2018-09-10T19:14:27.450 回答