docs: def read(self, timeout=None):
          '''
          Read from the transport. If no data is available, should return None.
          If timeout>0, will only block for `timeout` seconds.
          '''
          # If currently locked, another greenlet is trying to read, so yield
          # control and then return none. Required if a Connection is configured
          # to be synchronous, a sync callback is trying to read, and there's
          # another read loop running read_frames. Without it, the run loop will
          # release the lock but then immediately acquire it again. Yielding
          # control in the reading thread after bytes are read won't fix
          # anything, because it's quite possible the bytes read resulted in a
          # frame that satisfied the synchronous callback, and so this needs to
          # return immediately to first check the current status of synchronous
          # callbacks before attempting to read again.
          if self._read_lock.locked():
              self._read_wait.wait(timeout)
              return None
  
          self._read_lock.acquire()
          try:
              return super(GeventTransport, self).read(timeout=timeout)
          finally:
              self._read_lock.release()
              self._read_wait.set()
              self._read_wait.clear()