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 уже приводит к странному поведению