Контекст: я создаю проект 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 ()
Мой вопрос в том, есть ли способ снизить влияние импорта. Из-за того, что потоки загружают процессорное время, мое окно tkinter может не отвечать. Я не возражаю, если это займет немного больше времени, но я действительно не хочу вдаваться во все файлы библиотеки, чтобы добавить time.sleep (x).
Спасибо заранее.
Если ваше приложение выполняет другие функции, кроме распознавания лиц, вы можете отложить импорт до тех пор, пока не будет запрошено распознавание лиц.
Я имел в виду перейти в файл __init__ для open-cv и распознавания лиц, а затем сделать, как вы предложили, с time.sleep между каждым импортом (а затем, возможно, для каждого файла, вызываемого оттуда).
Я мог бы отложить импорт, но это намного удобнее, если им не нужно этого ждать (поэтому я не импортировал его при первой загрузке программы)
Если face_recognition написан на C, вероятно, следует выпустить GIL, чтобы разрешить выполнение основного потока. Этот комментарий находится на грани моих знаний, поэтому я не могу сказать больше, кроме как поискать в теге python GIL и, возможно, попросить помощи по python-list.






Большое спасибо @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
Я не понимаю последнее предложение. Основываясь на том, что я понимаю, считать, я бы попытался разделить оператор импорта на 2 оператора импорта.