Каков эффективный способ создания прослушивателя событий или проверки условий в потоке? - PullRequest
0 голосов
/ 15 февраля 2020

Я должен проверить некоторые условия, которые, когда он становится истинным, мне нужно запустить функцию на Flask серверном приложении. Например, в следующем коде мне нужно начать запись с камеры, чтобы сохранять файлы на локальный диск при доступе к маршруту моей камеры. Следующий код работает, но я не уверен, что это лучший способ сделать это или есть более эффективный способ.

import neceassary packages

app = Flask(__name__)

vs = VideoStream(src=0).start()
time.sleep(2.0)

@app.route("/")
def index():
    global idx, cams
    idx = True
    cams = False
    return render_template('index.html')


@app.route('/camera')
def cam():
    global idx, cams
    idx = False
    cams = True
    return render_template('camera.html')

####Fuction for generating live video feed


@app.route("/video_feed")
def video_feed():
# return the response generated along with the specific media
# type (mime type)
    return Response(generate(),
        mimetype = "multipart/x-mixed-replace; boundary=frame")


def listener():
     ## This function starts writing the video feed through cv2.VideoWriter, all defined in ClipWriter class

    cw = ClipWriter()

    while True:

        fr = vs.read()

        if cams and not idx:
            print("Rec")
            if not cw.recording:
                timestamp = datetime.datetime.now()
                path = "{}/{}.avi".format("vids/", timestamp.strftime("%Y%m%d-%H%M%S"))
                cw.start(path, cv2.VideoWriter_fourcc(*"MJPG"), 30)

        cw.update(fr)

        if idx and not cams and cw.recording:
            print("Rec Stop" + " " + path)
            cw.finish()



if __name__ == '__main__':

     t2 = threading.Thread(target=listener)
     t2.daemon = True
     t2.start()

     app.run(host=args["ip"], port=args["port"], debug=True,
        threaded=True, use_reloader=False)

vs.stop()

Теперь сцена состоит в том, что моя функция записи работает в отдельном и только проверяет условие для флаговых переменных cams и idx, являющихся истинными, для запуска функций из ClipWriter класса.

В общем, мне нужен эффективный способ, чтобы проверить условия (которые могут быть события, происходящие на любой странице на моем сервере), чтобы запустить мои функции. Я просто попытался сделать своего рода даже слушателя в моей функции слушателя, используя While True:, чтобы проверить, что условие выполнено, и выполнить функции в зависимости от определенных событий, происходящих на моих разных страницах или при доступе к новым страницам, а не обязательно все события могут происходить через действия пользователя. Учитывая, что я вообще не использую Javascript, есть ли эффективный способ сделать слушатель событий , который поможет мне избавиться от While True?

...