Я новичок в python и только что привык к многопоточности - мне удалось создать мой первый скрипт, который хорошо работает, но он выполняет задания вместо того, чтобы запускать их одновременно.
По сути, я открываю домашнюю систему видеонаблюденияПодача камер - у меня есть 5 камер, но поскольку они открываются в потоках, они показывают изображения только каждую секунду. Я исследовал и думаю, что мне нужно использовать многопроцессорность, а не многопоточность.
Вот мой существующий код, который использовал многопоточность - с удалением некоторых дополнительных частей:
from threading import Thread
import imutils
import cv2, time
import argparse
import numpy as np
import datetime
import time
from multiprocessing import Process
camlink1 = "rtsp://link1"
camlink2 = "rtsp://link2"
camlink3 = "rtsp://link3"
camlink4 = "rtsp://link4"
camlink5 = "rtsp://link5"
class VideoStreamWidget(object):
def __init__(self, link, camname, src=0):
self.capture = cv2.VideoCapture(link)
self.capture.set(cv2.CAP_PROP_FPS, 2)
# Start the thread to read frames from the video stream
self.thread = Thread(target=self.update, args=())
self.thread.daemon = True
self.thread.start()
self.camname = camname
self.link = link
def update(self):
# Read the next frame from the stream in a different thread
while True:
if self.capture.isOpened():
(self.status, self.frame) = self.capture.read()
def show_frame(self):
try:
# Display frames in main program
frame = self.frame
(h, w) = frame.shape[:2]
cv2.imshow('Frame ' + self.camname, frame)
key = cv2.waitKey(1)
if key == ord('q'):
self.capture.release()
cv2.destroyAllWindows()
exit(1)
time.sleep(.05)
except AttributeError:
print("[ISSUE] Problem with " + self.camname + "...")
self.capture = cv2.VideoCapture(self.link)
print("[INFO] Reconnected with " + self.camname + "...")
pass
if __name__ == '__main__':
video_stream_widget = VideoStreamWidget(camlink1,"Cam1")
video_stream_widget2 = VideoStreamWidget(camlink2,"Cam2")
video_stream_widget3 = VideoStreamWidget(camlink3,"Cam3")
video_stream_widget4 = VideoStreamWidget(camlink4,"Cam4")
video_stream_widget5 = VideoStreamWidget(camlink5,"Cam5")
while True:
video_stream_widget.show_frame()
video_stream_widget2.show_frame()
video_stream_widget3.show_frame()
video_stream_widget4.show_frame()
video_stream_widget5.show_frame()
Как вы можете видетьвнизу я создаю 5 разных "video_stream_widget", но я не делаю этого, это лучшая практика. Может кто-нибудь помочь мне подсказать, как я мог изменить этот код так, чтобы он использовал многопроцессорность, а не многопоточность?
Я пробовал базовый подход к изменению «потока» на «процесс», но это не сработало.
Спасибо, Крис