# Wait to write
        while Global.write_num != worker_id:
            time.sleep(0.01)

        # Send frame to global
        write_frame_list[worker_id] = frame_process

        # Expect next worker to write frame
        Global.write_num = next_id(Global.write_num)


if __name__ == '__main__':

    # Global variables
    Global = Manager().Namespace()
    Global.buff_num = 1
    Global.read_num = 1
    Global.write_num = 1
    Global.frame_delay = 0
    Global.is_exit = False
    read_frame_list = Manager().dict()
    write_frame_list = Manager().dict()

    # Number of workers (subprocess use to process frames)
    worker_num = cpu_count()

    # Subprocess list
    p = []

    # Create a subprocess to capture frames
    video_src = 0
def realtime_facial_recognize():
    #Apparently this fixes something on macOS? I'm not sure why
    #but the Face Recognition source code knows more than I do.
    if platform.system() == 'Darwin':
        set_start_method('forkserver')

    #print("Declaring Globals")
    #Globals
    Global = Manager().Namespace()
    Global.buff_num = 1
    Global.read_num = 1
    Global.write_num = 1
    Global.frame_delay = 0
    Global.exited = False
    read_frame_list = Manager().dict()
    write_frame_list = Manager().dict()

    #if more than 2, use one to cap frames
    if cpu_count() > 2:
        w_num = cpu_count() - 1
    else:
        w_num = 2

    #list of subprocesses
    p = []

    #print("Appending Thread Capture")
    p.append(
        threading.Thread(target=capture,
                         args=(read_frame_list, Global, w_num)))
    p[0].start()
    #print("Appended")

    tdogg_image = face_recognition.load_image_file("tdogg.jpg")
    tdogg_enc = face_recognition.face_encodings(tdogg_image)[0]
    aryan_image = face_recognition.load_image_file("aryan.jpg")
    aryan_enc = face_recognition.face_encodings(aryan_image)[0]
    ryan_image = face_recognition.load_image_file("ryan.jpg")
    ryan_enc = face_recognition.face_encodings(ryan_image)[0]

    Global.known_face_encodings = [tdogg_enc, aryan_enc, ryan_enc]

    Global.known_face_names = ["T-Dogg", "Aryan Chaudhary", "Ryan Meliti"]

    print("Registering Worker Threads")
    #register worker threads
    for w_id in range(1, w_num + 1):
        p.append(
            Process(target=process,
                    args=(w_id, read_frame_list, write_frame_list, Global,
                          w_num)))
        p[w_id].start()
    print("Worker Threads Registered")

    #show video
    last_num = 1
    fps_list = []
    temp = time.time()  #start time
    print("starting show")
    while not Global.exited:
        while Global.write_num != last_num:
            last_num = int(Global.write_num)
            print("Calc FPS")
            #calc fps
            delay = time.time() - temp
            temp = time.time()
            fps_list.append(delay)
            if len(fps_list) > 5 * w_num:
                fps_list.pop(0)
            fps = len(fps_list) / numpy.sum(fps_list)
            print("fps: %.2f" % fps)

            #Frame delay based on values in facerec_from_webcam_multiprocessing.py
            if fps < 6:
                Global.frame_delay = (1 / fps) * 0.75
            elif fps < 20:
                Global.frame_delay = (1 / fps) * 0.5
            elif fps < 30:
                Global.frame_delay = (1 / fps) * 0.25
            else:
                Global.frame_delay = 0

            #print("Loading Video")
            #finally, display the result
            cv2.imshow('Video',
                       write_frame_list[prev_id(Global.write_num, w_num)])

        if cv2.waitKey(1) & 0xFF == ord('q'):
            Global.exited = True
            break
    time.sleep(0.01)
    v_capture.release()
    cv2.destroyAllWindows()