You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

wait.py 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from .selectors import (
  2. HAS_SELECT,
  3. DefaultSelector,
  4. EVENT_READ,
  5. EVENT_WRITE
  6. )
  7. def _wait_for_io_events(socks, events, timeout=None):
  8. """ Waits for IO events to be available from a list of sockets
  9. or optionally a single socket if passed in. Returns a list of
  10. sockets that can be interacted with immediately. """
  11. if not HAS_SELECT:
  12. raise ValueError('Platform does not have a selector')
  13. if not isinstance(socks, list):
  14. # Probably just a single socket.
  15. if hasattr(socks, "fileno"):
  16. socks = [socks]
  17. # Otherwise it might be a non-list iterable.
  18. else:
  19. socks = list(socks)
  20. with DefaultSelector() as selector:
  21. for sock in socks:
  22. selector.register(sock, events)
  23. return [key[0].fileobj for key in
  24. selector.select(timeout) if key[1] & events]
  25. def wait_for_read(socks, timeout=None):
  26. """ Waits for reading to be available from a list of sockets
  27. or optionally a single socket if passed in. Returns a list of
  28. sockets that can be read from immediately. """
  29. return _wait_for_io_events(socks, EVENT_READ, timeout)
  30. def wait_for_write(socks, timeout=None):
  31. """ Waits for writing to be available from a list of sockets
  32. or optionally a single socket if passed in. Returns a list of
  33. sockets that can be written to immediately. """
  34. return _wait_for_io_events(socks, EVENT_WRITE, timeout)