Как последовательно получить данные, возвращаемые функцией потока в Python - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над проектом, в котором я вызываю face recognition API, который возвращает status, subject id любого человека. Этот API занимает некоторое время, поэтому я поместил его в функцию потока, чтобы основной поток продолжал работать, и как только API получит значения, мы будем работать соответственно. Ниже приведен код:

class RecognizeFaceInFrame(Thread):
    global person_image
    global f_startX, f_startY, f_endX, f_endY

    def __init__(self):
        super().__init__()

        self.subject_id = " "
        self.get_face_name = False
        self.stop_thread = False
        self.face_status = " "
        self.confidence = 0
        self.data_present = False

    def recognize_face_frame(self):
        if self.get_face_name:
            face_bbox = (f_startX, f_startY, f_endX, f_endY)

            face_image = helper.convert_rect_to_mat_and_save_image(face_bbox, person_image, 10, 30, 'face', 0, save_img=False, conf_score=0, roi_id='test')
            helper.log.error("Thread function called")
            cv2.imwrite("file.jpg", face_image)
            with open("file.jpg", "rb") as image_file:
                face_base64 = base64.b64encode(image_file.read())

            (self.face_status, self.subject_id, self.confidence) = face.recognize_face_ttfr(face_base64, vision_config['FactoryGalleryName'], vision_config["CallFaceRecognition"])
            self.get_face_name = False
            self.data_present = True
        time.sleep(1)

    def run(self):
        while not self.stop_thread:
            self.recognize_face_frame()


### SOME CODE
### SOME CODE
### SOME CODE

thread = RecognizeFaceInFrame()  
thread.start()

### SOME CODE

if objectID not in face_recognition_subjectid or face_recognition_subjectid[objectID] == "Await":
    thread.get_face_name = True
    while thread.data_present:
        if thread.face_status == "Success":
            name = thread.subject_id
            # Do some work
        else:
            # Do some work

        thread.data_present = False

Объяснение кода:

В приведенном выше коде, если это условие if objectID not in face_recognition_subjectid or face_recognition_subjectid[objectID] == "Await": становится True, я выполняю thread.get_face_name до True, что активирует функцию потока recognize_face_frame. Затем будет сделан вызов и вернет данные, а затем я использую данные в коде. Это работает нормально

Проблема

Приведенный выше код работает нормально, только если в кадре только один человек. Допустим, в кадре два человека, поэтому в API будет сделано 2 вызова, которые будут возвращать данные, но на этот раз я не уверен, какие данные принадлежат этому человеку, поскольку нет сопоставления и, следовательно, назначены неверные данные. не тому человеку.

Решение

Я ищу какое-то решение, в котором я могу получить данные в последовательности из потока

                    (Input) 
    Thread Function <------------------------------------   
(Output)|                   |                           |
        |                   |                           |
        |    (Request Id 1) |            (Request Id 2) |
        |                   |                           |
        |                   |                           |
        |               person 1 call             person 2 call
        |                   |                           |
        |                   |                           |
        |  (Data with Id 1) |          (Data with Id 2) |
        |                   |                           |
        |                   |                           |
        |------------------------------------------------

Таким образом, если выполняется вызов для лица 1, а затем выполняется вызов для лица 2, данные, возвращаемые из потока, должны быть сначала для лица 1, а затем для лица 2. Я знаю о queue, но я не думаю, что в нем есть какая-то последовательность. Может кто-нибудь, пожалуйста, предложите несколько хороших решений. Пожалуйста помоги. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...