docs: def readAsync(self, fileName, callback, **kwargs):
          """
          Interprets the specified file asynchronously, interpreting it as a
          model or a script file. As a side effect, it invalidates all entities
          (as the passed file can contain any arbitrary command); the lists of
          entities will be re-populated lazily (at first access).
  
          Args:
              fileName: Path to the file (Relative to the current working
              directory or absolute).
  
              callback: Callback to be executed when the file has been
              interpreted.
          """
          if self._langext is not None:
              with open(fileName, 'r') as fin:
                  newmodel = self._langext.translate(fin.read(), **kwargs)
                  with open(fileName+'.translated', 'w') as fout:
                      fout.write(newmodel)
                      fileName += '.translated'
  
          def async_call():
              self._lock.acquire()
              try:
                  self._impl.read(fileName)
                  self._errorhandler_wrapper.check()
              except Exception:
                  self._lock.release()
                  raise
              else:
                  self._lock.release()
                  callback.run()
          Thread(target=async_call).start()