code: def _proc_loop(proc_id, alive, queue, fn):
          
          print("proc {} started".format(proc_id))
          try:
              while alive.value:
                  data = fn()
                  put_success = False
                  while alive.value and not put_success:
                      try:
                          queue.put(data, timeout=0.5)
                          put_success = True
                      except QFullExcept:
                          # print("Queue Full")
                          pass
          except KeyboardInterrupt:
              print("W: interrupt received, stopping process {} ...".format(proc_id))
          print("Closing process {}".format(proc_id))
          queue.close()
docs: Thread loop for generating data
  
          Parameters
          ----------
          proc_id: int
              Process id
          alive: multiprocessing.Value
              variable for signaling whether process should continue or not
          queue: multiprocessing.Queue
              queue for passing data back
          fn: function
              function object that returns a sample to be pushed into the queue