尝试将长期运行的任务从Django卸载到单独的线程

时间:2018-12-14 19:51:10

标签: django python-3.x multithreading django-admin

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

谢谢!

标记

0 个答案:

没有答案