class_docstr: A reentrant lock, functions in a similar way to threading.RLock in that it
  can be acquired multiple times.  When the corresponding number of release()
  calls are made the lock will finally release the underlying file lock.
class_docstr_tok: ["A","reentrant","lock",",","functions","in","a","similar","way","to","threading.RLock","in","that","it","can","be","acquired","multiple","times",".","When","the","corresponding","number","of","release","(",")","calls","are","made","the","lock","will","finally","release","the","underlying","file","lock","."]
code: def release(self):
      if self._acquire_count == 0:
          raise exceptions.LockException(
              "Cannot release more times than acquired"
          )
  
      if self._acquire_count == 1:
          super(RLock, self).release()
      self._acquire_count -= 1
  
imports: import os
  import time
  import atexit
  import tempfile
  import contextlib
  from .None import exceptions
  from .None import constants
  from .None import portalocker
label_desc: Use image node_id 3 for calling the RLock obj's underlying member method code with example usage: obj.release() without return types