code: def _feed(
      buffer,
      notempty,
      send_bytes,
      writelock,
      reader_close,
      writer_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")
                          reader_close()
                          writer_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 types
  import weakref
  import errno
  from queue import Empty, Full
  import _multiprocessing
  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 20 for calling the Queue obj's underlying member method code with example usage: obj._feed(buffer, notempty, send_bytes, writelock, reader_close, writer_close, ignore_epipe, onerror, queue_sem) without return types