многопроцессорная обработка python выполняется медленнее во второй раз без завершения всей программы

#python #multiprocessing

#python #многопроцессорная обработка

Вопрос:

У меня есть программа на python opencv gui , которая использует многопроцессорную обработку в потоковой передаче в экземпляре класса.

После запуска приведенного ниже скрипта, когда я набираю q текст, он завершает вспомогательный цикл и завершает или присоединяется ко всем существующим потокам, процессам и очереди закрытия в модулях.

И затем, если я введу r , он снова запустит вспомогательный цикл, но на этот раз рабочий в многопроцессорной обработке выполняется в два раза медленнее. Я понятия не имею, почему это происходит.

код выглядит следующим образом.

     module_started = False
    height = 480
    width = 800
    img_base = np.zeros((height,width,3), np.uint8)
    cv2.namedWindow("VIN", cv2.WINDOW_NORMAL)
    
    while True:
        
        if not module_started:
            cam1 = PersonDetector(0)
            cam1.start()
            outputs = []
            module_started = True
    
        while True:
     
                if cam1.new_detection:
                    outputs = cam1.get_output()
                
                if outputs:
                    
                    for xys in outputs:
                        (startX, startY, endX, endY) = xys
                        cv2.rectangle(cam1.frame, (startX, startY), (endX, endY), (255,5,150),2)
                
    
                # show the output image
                cv2.imshow("VIN", cam1.frame)
                key = cv2.waitKey(40) amp; 0xFF
                # if the `q` key was pressed, break from the loop
                if key == ord("q"):
                    break
                
            cam1.stop()
            del cam1
        
        # show the output frame
        
        cv2.imshow("VIN", img_base)
        key = cv2.waitKey(40) amp; 0xFF
      
        if key == ord("e"):          
            break
        if key == ord("r"):             # go back to start sub loop
            module_started = False
    
    cv2.destroyAllWindows()
 

он находится на Raspberry pi 4. он имеет ядро cpu 4.
в первый раз htop показывает процент процессора более 300%
, но во второй раз htop показывает процент процессора всего 99 или 100%…

почему это происходит?

Ответ №1:

Я тестировал сам целый день. Это было не из-за многопроцессорности или многопоточности.

Это было из-за cv2.imshow(), я удалил imshow, тогда все сохраняло ту же скорость, но при повторении imshow, как в приведенном выше коде, программа отключается, хотя я до сих пор не знаю, почему…