Как сказано в документации по Process.join
, зависание (или «блокировка» ) - это именно то, что ожидается:
Блокируйте вызывающий поток до тех пор, пока не завершится процесс, для которого вызывается метод join()
, или пока не истечет необязательное время ожидания.
join
останавливает текущий поток до завершения целевого процесса.Целевой процесс вызывает alternative_process_target_func
, поэтому проблема, очевидно, заключается в этой функции.Это никогда не заканчивается.Причин может быть несколько.
Задача 1
alternative_process_target_func
работает до output_queue.full()
.Что делать, если оно никогда не бывает полным?Это никогда не заканчивается?Действительно, лучше определить конец другим способом, например, запустить до тех пор, пока входная очередь не станет пустой.
Задача 2
input_queue.get()
заблокируется, если входная очередь пуста.Как указано в документации ,
Удалить и вернуть элемент из очереди.Если необязательный блок args имеет значение true, а время ожидания равно None (по умолчанию), блокируйте его, если необходимо, до тех пор, пока элемент не станет доступен.
Вы запускаете несколько процессов, поэтому не ожидайте, что во вводе что-то есть, простопотому что output_queue.full()
был Ложь минуту назад, и потому что размер ввода совпадает с размером вывода.Многое могло произойти за это время.
То, что вы хотите сделать:
try:
input_queue.get(false) # or input_queue.get_nowait()
except Empty:
break # stop when there is nothing more to read from the input
Задача 3
output_queue.put((frame_no, frame_no))
заблокируется, если в нем нет меставывод для хранения данных.
Опять же, вы предполагаете, что в выводе есть место только потому, что вы проверили output_queue.full()
несколько минут назад, и потому что размер ввода равен размеру вывода.Никогда не полагайтесь на такие вещи.
Вы хотите сделать то же самое, что и для ввода:
try:
output_queue.put((frame_no, frame_no), false)
# or output_queue.put_nowait((frame_no, frame_no))
except Empty:
# deal with this somehow, e.g.
raise Exception("There is no room in the output queue to write to.")