У меня есть приложение Django 2 с действием в администраторе, которое берет одно-много изображений и использует проект face_recognition для поиска лиц и сохранения информации о лицах в базе данных.Я хотел бы переложить это действие в другой поток.Тем не менее, в моей попытке начать новый поток приложение Django не возвращается, пока не будут завершены все потоки.Я думал, что если я поместу долгосрочную задачу в отдельный поток, то приложение Django вернется, и пользователь сможет делать с ним другие вещи, поскольку длительный процесс запускается в фоновом режиме.
Код действия DocumentAdmin:
def find_faces_4(self, request, queryset):
from biometric_identification.threaded_tasks import map_thread_pool_face_finder
images_to_scan = []
for obj in queryset:
# If the object is a Photo with one to many people, send to face recognition
metadata = DocumentMetaData.objects.filter(document_id = obj.document_id)[0].metadata
if "Photo Type" in metadata and metadata["Photo Type"] != 'No People':
images_to_scan.append(obj)
map_thread_pool_face_finder(images_to_scan)
Код для поиска изображений:
def map_thread_pool_face_finder(document_list):
t0 = timeit.default_timer()
pool = ThreadPool()
pool.map(fftask2, document_list)
pool.close()
pool.join()
t1 = timeit.default_timer()
logger.debug("Function map_thread_pool_face_finder {} seconds".format(t1 - t0))
def fftask2(obj):
find_faces_task(obj.document_id, obj.storage_file_name.name, settings.MEDIA_ROOT)
Функция find_faces_task выполняет фактическое сканирование изображений для лиц.
Я ожидал, что действие выдаст распознавание лиц отдельным нитям и вернется сразу же, пока изображения находятся в фоновом режиме.Распознавание лиц работает, но приложение Django заморожено, пока не будут найдены все изображения.Чего мне не хватает в моем понимании многопоточности или моего кода?
Спасибо!
Марк