thread.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """Module containing the SessionThread class."""
  2. import threading
  3. import uuid
  4. import requests.exceptions as exc
  5. from .._compat import queue
  6. class SessionThread(object):
  7. def __init__(self, initialized_session, job_queue, response_queue,
  8. exception_queue):
  9. self._session = initialized_session
  10. self._jobs = job_queue
  11. self._create_worker()
  12. self._responses = response_queue
  13. self._exceptions = exception_queue
  14. def _create_worker(self):
  15. self._worker = threading.Thread(
  16. target=self._make_request,
  17. name=uuid.uuid4(),
  18. )
  19. self._worker.daemon = True
  20. self._worker._state = 0
  21. self._worker.start()
  22. def _handle_request(self, kwargs):
  23. try:
  24. response = self._session.request(**kwargs)
  25. except exc.RequestException as e:
  26. self._exceptions.put((kwargs, e))
  27. else:
  28. self._responses.put((kwargs, response))
  29. finally:
  30. self._jobs.task_done()
  31. def _make_request(self):
  32. while True:
  33. try:
  34. kwargs = self._jobs.get_nowait()
  35. except queue.Empty:
  36. break
  37. self._handle_request(kwargs)
  38. def is_alive(self):
  39. """Proxy to the thread's ``is_alive`` method."""
  40. return self._worker.is_alive()
  41. def join(self):
  42. """Join this thread to the master thread."""
  43. self._worker.join()