code: def readDataAsync(self, fileName, callback):
          
          def async_call():
              self._lock.acquire()
              try:
                  self._impl.readData(fileName)
                  self._errorhandler_wrapper.check()
              except Exception:
                  self._lock.release()
                  raise
              else:
                  self._lock.release()
                  callback.run()
          Thread(target=async_call).start()
docs: Interprets the specified data file asynchronously. When interpreting is
          over, the specified callback is called. The file is interpreted as
          data. 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: Full path to the file.
  
              callback: Callback to be executed when the file has been
              interpreted.