import torchvision ломает передачу данных между потоками python

Моё приложение работает в двух потоках, в одном я получаю кадры с камеры и передаю в другой в очередь при помощи Queue.

import cv2
from Render import Render


class DroneCamera:
    def __init__(self):
        self.video = cv2.VideoCapture(-1)
        self.render = Render(self)
        self.is_run = True
        
    def main(self):
        try:
            self.run()
        except KeyboardInterrupt:
            print("DroneCamera stop")
        finally:
            cv2.destroyAllWindows()
            self.video.release()

    def run(self):
        self.render.start()
        while self.is_run:
            _, frame = self.video.read()

            if frame is None:
                break

            self.render.frame_queue.put(frame)

render это экземпляр класса Render, который является отдельным потоком. Это отлично работает, пока я не добавляю в основном потоке import torchvision. Опытным путём я выяснил, что проблема в том, что элементы в очередь добавляются, но в классе Render очередь пустая. Почему так может происходит и как это исправить?

class Render(threading.Thread):
    def __init__(self) -> None:
        super().__init__(name="frame-render-thread", daemon=True)
        self.frame_queue = LifoQueue()

    def run(self) -> None:
        try:
            self.render()
        finally:
            cv2.destroyAllWindows()

    def render(self) -> None:
        while True:
            if not self.frame_queue.empty():
                frame = self.frame_queue.get()
               
                cv2.imshow("Output", frame)

                key = cv2.waitKey(1) & 0xFF
                if key == ord("q"):
                    break
                if cv2.getWindowProperty("Output", cv2.WND_PROP_VISIBLE) < 1:
                    break

Я был очень удивлён, что код неожиданно перестал работать. Выяснил эту проблему опытным путём. Полагаю torchvision забирает GIL на себя, либо ещё что-то. UPD: Я также обратил внимание, что import torch работает корректно, ничего не ломается, а torchvision уже приводит к странному поведению


Ответы (0 шт):