code: def _feed(
      buffer,
      notempty,
      send_bytes,
      writelock,
      close,
      ignore_epipe,
      onerror,
      queue_sem,
  ):
      debug("starting thread to feed data to pipe")
      nacquire = notempty.acquire
      nrelease = notempty.release
      nwait = notempty.wait
      bpopleft = buffer.popleft
      sentinel = _sentinel
      if sys.platform != "win32":
          wacquire = writelock.acquire
          wrelease = writelock.release
      else:
          wacquire = None
  
      while 1:
          try:
              nacquire()
              try:
                  if not buffer:
                      nwait()
              finally:
                  nrelease()
              try:
                  while 1:
                      obj = bpopleft()
                      if obj is sentinel:
                          debug("feeder thread got sentinel -- exiting")
                          close()
                          return
  
                      # serialize the data before acquiring the lock
                      obj = _ForkingPickler.dumps(obj)
                      if wacquire is None:
                          send_bytes(obj)
                      else:
                          wacquire()
                          try:
                              send_bytes(obj)
                          finally:
                              wrelease()
              except IndexError:
                  pass
          except Exception as e:
              if ignore_epipe and getattr(e, "errno", 0) == errno.EPIPE:
                  return
              # Since this runs in a daemon thread the resources it uses
              # may be become unusable while the process is cleaning up.
              # We ignore errors which happen after the process has
              # started to cleanup.
              if is_exiting():
                  info("error in queue thread: %s", e)
                  return
              else:
                  # Since the object has not been sent in the queue, we need
                  # to decrease the size of the queue. The error acts as
                  # if the object had been silently removed from the queue
                  # and this step is necessary to have a properly working
                  # queue.
                  queue_sem.release()
                  onerror(e, obj)
  
imports: import sys
  import os
  import threading
  import collections
  import time
  import weakref
  import errno
  from queue import Empty, Full
  from .None import connection
  from .None import context
  from .util import debug, info, Finalize, register_after_fork, is_exiting
label_desc: Use image node_id 18 for calling the Queue obj's underlying member method code with example usage: obj._feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, onerror, queue_sem) without return types