VideoCapture get() returns old frame after long periods of time using 3 cameras

throw a ton of logging output (print) in your code. prefix each line with a timestamp (wall clock time or time.perf_counter())

because it’s a bunch of threads, make a “logging function” that acquires and releases a lock before writing, so you get whole lines with carriage return, instead of some interleaved mess.