我有一个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应用程序被冻结,直到找到所有图像。在对多线程或代码的理解中我缺少什么?
谢谢!
标记