code: def join(self):
          
          self.closed = True
  
          while self.expect > 0:
              val = self.wait_change.get()
              self.expect -= 1
  
              if val is not None:
                  # Wait a while for all running greenlets to exit, and
                  # then attempt to force them to exit so join()
                  # terminates in a reasonable amount of time.
                  gevent.joinall(list(self.greenlets), timeout=30)
                  gevent.killall(list(self.greenlets), block=True, timeout=30)
                  raise val
docs: Wait for transfer to exit, raising errors as necessary.