title: Python multiprocessing hangs at join
body: <p>I am reading a video file such that out for every 20 frames I'm storing first  frames in Input Queue. Once I get all the required frames in Input Queue, then I run multiple processes to perform some operation on these frames and store the results in output queue. 
  But the code always stuck at join, I tried different solutions proposed for such problems but none of them seems to work.</p>
  
  <pre><code>import numpy as np
  import cv2
  import timeit
  import face_recognition
  from multiprocessing import Process, Queue, Pool
  import multiprocessing
  import os
  
  s = timeit.default_timer()
  
  def alternative_process_target_func(input_queue, output_queue):
  
      while not output_queue.full():
          frame_no, small_frame, face_loc = input_queue.get()
          print('Frame_no: ', frame_no, 'Process ID: ', os.getpid(), '----', multiprocessing.current_process())
          #canny_frame(frame_no, small_frame, face_loc)
  
          #I am just storing frame no for now but will perform something else later
          output_queue.put((frame_no, frame_no)) 
  
          if output_queue.full():
              print('Its Full ---------------------------------------------------------------------------------------')
          else:
              print('Not Full')
  
      print(timeit.default_timer() - s, ' seconds.')
      print('I m not reading anymore. . .', os.getpid())
  
  
  def alternative_process(file_name):
      start = timeit.default_timer()
      cap = cv2.VideoCapture(file_name)
      frame_no = 1
      fps = cap.get(cv2.CAP_PROP_FPS)
      length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
      print('Frames Per Second: ', fps)
      print('Total Number of frames: ', length)
      print('Duration of file: ', int(length / fps))
      processed_frames = 1
      not_processed = 1
      frames = []
      process_this_frame = True
      frame_no = 1
      Input_Queue = Queue()
      while (cap.isOpened()):
          ret, frame = cap.read()
          if not ret:
              print('Size of input Queue: ', Input_Queue.qsize())
              print('Total no of frames read: ', frame_no)
              end1 = timeit.default_timer()
              print('Time taken to fetch useful frames: ', end1 - start)
              threadn = cv2.getNumberOfCPUs()
              Output_Queue = Queue(maxsize=Input_Queue.qsize())
              process_list = []
              #quit = multiprocessing.Event()
              #foundit = multiprocessing.Event()
  
              for x in range((threadn - 1)):
                  # print('Process No : ', x)
                  p = Process(target=alternative_process_target_func, args=(Input_Queue, Output_Queue))#, quit, foundit
                  #p.daemon = True
                  p.start()
                  process_list.append(p)
                  #p.join()
  
              # for proc in process_list:
              #     print('---------------------------------------------------------------', proc.p)
  
              i = 1
              for proc in process_list:
                  print('I am hanged here')
                  proc.join()
                  print('I am done')
                  i += 1
  
              end = timeit.default_timer()
              print('Time taken by face verification: ', end - start)
  
              break
  
          if process_this_frame:
              print(frame_no)
              small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
              rgb_small_frame = small_frame[:, :, ::-1]
              face_locations = face_recognition.face_locations(rgb_small_frame)
              # frames.append((rgb_small_frame, face_locations))
              Input_Queue.put((frame_no, rgb_small_frame, face_locations))
              frame_no += 1
  
          if processed_frames &lt; 5:
              processed_frames += 1
              not_processed = 1
  
          else:
              if not_processed &lt; 15:
                  process_this_frame = False
                  not_processed += 1
              else:
  
                  processed_frames = 1
                  process_this_frame = True
                  print('-----------------------------------------------------------------------------------------------')
  
      cap.release()
      cv2.destroyAllWindows()
  
  alternative_process('user_verification_2.avi')
  </code></pre>