【问题标题】:Python reduce import CPU impactPython 减少导入 CPU 影响
【发布时间】:2019-02-14 05:32:49
【问题描述】:

上下文:我正在创建一个包含人脸识别的 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)

非常感谢。

【问题讨论】:

  • 最后一句话没看懂。根据我认为的理解,我会尝试将 import 语句拆分为 2 个 import 语句。
  • 如果您的应用执行人脸识别以外的操作,您可以延迟导入,直到请求人脸识别。
  • 我的意思是进入 __init__ 文件以进行 open-cv 和面部识别,然后在每次导入之间使用 time.sleep 执行您的建议(然后可能对于从那里调用的每个文件)。
  • 我可以延迟导入,但如果他们不必等待它会更加用户友好(因此我在第一次加载程序时没有导入它)
  • 如果 face_recognition 是用 C 编写的,它可能应该释放 GIL 以允许主线程运行。这个评论是我知识的边缘,所以我不能说更多,除了在“python”标签中搜索 GIL 并可能在 python-list 上寻求帮助。

标签: python import cpu-time


【解决方案1】:

非常感谢@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

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 2018-01-09
    • 2020-02-16
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多