code: def put(self, obj, block=True, timeout=None):
      if self._closed:
          raise ValueError(f"Queue {self!r} is closed")
      if not self._sem.acquire(block, timeout):
          raise Full
  
      with self._notempty, self._cond:
          if self._thread is None:
              self._start_thread()
          self._buffer.append(obj)
          self._unfinished_tasks.release()
          self._notempty.notify()
  
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 4 for calling the JoinableQueue obj's underlying member method code with example usage: obj.put(obj, block, timeout) without return types