Как запустить time.sleep() без остановки цикла while

#python-3.x #async-await #parallel-processing #opencv-python

Вопрос:

Есть ли способ вызвать функцию, у которой есть ожидание(time.sleep()) из бесконечного цикла while, не нарушая цикл? Я пытаюсь выполнить несколько задач, для выполнения которых требуется подождать несколько секунд, но проблема в том, что цикл while также останавливается, когда происходит процесс ожидания. Это то, что я опробовал — Вот мой код:

 import cv2
import time

def waiting():
    print("Inside function")
    # Running Some Tasks
    time.sleep(5)
    print("Done sleeping")


def main():
    cap = cv2.VideoCapture(0)

    while True:
        ret, frame = cap.read()
        cv2.imshow("Webcam", frame)

        k = cv2.waitKey(10)
        if k == 32:  # Press SPACEBAR for wait function
            waiting()
        elif k == 27:  # Press ESC to stop code
            break
    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()
 

Ответ №1:

В данный момент вы работаете в одном потоковом сценарии. Вы должны использовать потоковую или многопроцессорную обработку. Это делает (похоже) несколько процессов (активными). Зависит от того, используете ли вы многопоточность или многопроцессорность.

Комментарии:

1. Спасибо за предложение, я его проверю. Ценю ваше время.

2. @git-ruthvik Дай мне знать, как все идет. удачи!

Ответ №2:

Вы должны использовать потоки. Это будет выглядеть так, как будто компьютер выполняет их оба одновременно.

 import threading

t = threading.Thread(target=function)
t.start()
 

Комментарии:

1. Спасибо за ваш вклад, это сработало!

2. Извините @cris новичок на этой платформе

Ответ №3:

Спасибо за быстрые ответы от @JLT и @TerePiim. Вот обновленный код для всех, кто может извлечь из этого выгоду:

 import cv2
import time
import threading


def waiting():
    print("Inside parallel function")
    # Running some Tasks
    time.sleep(5)
    print("Done sleeping")


def main():
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        cv2.imshow("Webcam", frame)
        k = cv2.waitKey(10)
        if k == 32:  # Press SPACEBAR for wait function
            t = threading.Thread(target=waiting)
            t.start()

        elif k == 27:  # Press ESC to stop code
            break
    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()