Python减少导入CPU的影响

Python减少导入CPU的影响,python,import,cpu-time,Python,Import,Cpu Time,背景:我正在创建一个tkinter项目,其中包括人脸识别。因为导入人脸识别,cv2需要很长时间,为了使它更方便,它被放置在一个线程中(我知道tkinter不喜欢线程,但它们非常有用)。例如 我的问题是,有没有办法降低进口的影响。由于占用大量的CPU时间,tkinter窗口可能会无响应。我不介意它是否需要稍长的时间,但我真的不想进入所有库文件来添加time.sleep(x) 非常感谢。非常感谢@TerryJanReedy对吉尔的评论。基于此,我设置了一个multiprocessing.Proces

背景:我正在创建一个tkinter项目,其中包括人脸识别。因为导入人脸识别,cv2需要很长时间,为了使它更方便,它被放置在一个线程中(我知道tkinter不喜欢线程,但它们非常有用)。例如

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


非常感谢。

非常感谢@TerryJanReedy对吉尔的评论。基于此,我设置了一个
multiprocessing.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

我不明白最后一句话。根据我的理解,我会尝试将导入语句拆分为两个导入语句。如果你的应用程序执行人脸识别以外的操作,您可以延迟导入,直到请求人脸识别。我的意思是进入
\uuuu init\uuuu
文件以打开cv和人脸识别,然后按照您建议的
时间执行。每次导入之间(然后可能从那里调用每个文件)都需要睡眠。我可以延迟导入,但如果他们不必等待导入(因此我在第一次加载程序时没有导入它),那么用户友好得多。如果face_recognition是用C编写的,它可能应该释放GIL以允许主线程运行。这个评论是我所知的边缘,所以我不能再多说了,除了搜索GIL的“python”标签,并可能在python列表上寻求帮助。
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