--- /dev/null
+diff --git a/tests/threaded/test_pool.py b/tests/threaded/test_pool.py
+index 3e54b3c..9583c7b 100644
+--- a/tests/threaded/test_pool.py
++++ b/tests/threaded/test_pool.py
+@@ -5,6 +5,7 @@ except ImportError:
+ import Queue as queue
+ import unittest
+
++import sys
+ import mock
+ import pytest
+
+@@ -60,6 +61,7 @@ class TestPool(unittest.TestCase):
+ assert session.called is True
+ session.assert_called_once_with()
+
++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2")
+ def test_from_exceptions_populates_a_queue(self):
+ """Ensure a Queue is properly populated from exceptions."""
+ urls = ["https://httpbin.org/get?n={}".format(n) for n in range(5)]
+@@ -77,6 +79,7 @@ class TestPool(unittest.TestCase):
+ for url in urls
+ ]
+
++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2")
+ def test_from_urls_constructs_get_requests(self):
+ """Ensure a Queue is properly populated from an iterable of urls."""
+ urls = ["https://httpbin.org/get?n={}".format(n) for n in range(5)]
+@@ -92,6 +95,7 @@ class TestPool(unittest.TestCase):
+ for url in urls
+ ]
+
++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2")
+ def test_from_urls_constructs_get_requests_with_kwargs(self):
+ """Ensure a Queue is properly populated from an iterable of urls."""
+ def merge(*args):
+@@ -130,6 +134,7 @@ class TestPool(unittest.TestCase):
+ for st in session_threads:
+ st.join.assert_called_once_with()
+
++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2")
+ def test_get_response_returns_thread_response(self):
+ """Ensure that a ThreadResponse is made when there's data."""
+ queues = []
+@@ -149,6 +154,7 @@ class TestPool(unittest.TestCase):
+ assert isinstance(p.get_response(), pool.ThreadResponse)
+ assert len([q for q in queues if q.get_nowait.called]) == 1
+
++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2")
+ def test_get_exception_returns_thread_exception(self):
+ """Ensure that a ThreadException is made when there's data."""
+ queues = []
+@@ -168,6 +174,7 @@ class TestPool(unittest.TestCase):
+ assert isinstance(p.get_exception(), pool.ThreadException)
+ assert len([q for q in queues if q.get_nowait.called]) == 1
+
++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2")
+ def test_get_response_returns_none_when_queue_is_empty(self):
+ """Ensure that None is returned when the response Queue is empty."""
+ queues = []
+@@ -187,6 +194,7 @@ class TestPool(unittest.TestCase):
+ assert p.get_response() is None
+ assert len([q for q in queues if q.get_nowait.called]) == 1
+
++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2")
+ def test_get_exception_returns_none_when_queue_is_empty(self):
+ """Ensure that None is returned when the exception Queue is empty."""
+ queues = []
--- /dev/null
+From c4f918572751151eb3bfc7dfa94580b3e2867a9e Mon Sep 17 00:00:00 2001
+From: Jon Dufresne <jon.dufresne@gmail.com>
+Date: Sun, 3 Feb 2019 09:02:24 -0800
+Subject: [PATCH] Fix unhandled exceptions from threads during tests
+
+A queue.Queue() object was not always passed to SessionThread. In this
+case, SessionThread._make_request() would raise an exception trying to
+call methods on the expected object. Now, always pass a usable object to
+SessionThread.
+
+Previously appeared as:
+
+ Traceback (most recent call last):
+ File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner
+ self.run()
+ File "/usr/lib64/python3.7/threading.py", line 865, in run
+ self._target(*self._args, **self._kwargs)
+ File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request
+ kwargs = self._jobs.get_nowait()
+ AttributeError: 'NoneType' object has no attribute 'get_nowait'
+
+ Exception in thread cd08fad6-d21d-41b0-921e-737a149b12be:
+ Traceback (most recent call last):
+ File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner
+ self.run()
+ File "/usr/lib64/python3.7/threading.py", line 865, in run
+ self._target(*self._args, **self._kwargs)
+ File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request
+ kwargs = self._jobs.get_nowait()
+ AttributeError: 'NoneType' object has no attribute 'get_nowait'
+
+ Exception in thread 4fb72f0d-ba1c-4a78-97a2-4a7283ea01fe:
+ Traceback (most recent call last):
+ File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner
+ self.run()
+ File "/usr/lib64/python3.7/threading.py", line 865, in run
+ self._target(*self._args, **self._kwargs)
+ File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request
+ kwargs = self._jobs.get_nowait()
+ AttributeError: 'NoneType' object has no attribute 'get_nowait'
+
+ Exception in thread 5f3711af-0c01-4821-9e25-8074bbbf769b:
+ Traceback (most recent call last):
+ File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner
+ self.run()
+ File "/usr/lib64/python3.7/threading.py", line 865, in run
+ self._target(*self._args, **self._kwargs)
+ File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request
+ kwargs = self._jobs.get_nowait()
+ AttributeError: 'NoneType' object has no attribute 'get_nowait'
+---
+ tests/threaded/test_pool.py | 15 ++++++++++-----
+ tests/threaded/test_thread.py | 5 ++++-
+ 2 files changed, 14 insertions(+), 6 deletions(-)
+
+diff --git a/tests/threaded/test_pool.py b/tests/threaded/test_pool.py
+index b0653bb..b949dd8 100644
+--- a/tests/threaded/test_pool.py
++++ b/tests/threaded/test_pool.py
+@@ -26,32 +26,37 @@ def test_requires_positive_number_of_processes(self):
+
+ def test_number_of_processes_can_be_arbitrary(self):
+ """Show that the number of processes can be set."""
+- p = pool.Pool(None, num_processes=100)
++ job_queue = queue.Queue()
++ p = pool.Pool(job_queue, num_processes=100)
+ assert p._processes == 100
+ assert len(p._pool) == 100
+
+- p = pool.Pool(None, num_processes=1)
++ job_queue = queue.Queue()
++ p = pool.Pool(job_queue, num_processes=1)
+ assert p._processes == 1
+ assert len(p._pool) == 1
+
+ def test_initializer_is_called(self):
+ """Ensure that the initializer function is called."""
++ job_queue = queue.Queue()
+ initializer = mock.MagicMock()
+- pool.Pool(None, num_processes=1, initializer=initializer)
++ pool.Pool(job_queue, num_processes=1, initializer=initializer)
+ assert initializer.called is True
+ initializer.assert_called_once_with(mock.ANY)
+
+ def test_auth_generator_is_called(self):
+ """Ensure that the auth_generator function is called."""
++ job_queue = queue.Queue()
+ auth_generator = mock.MagicMock()
+- pool.Pool(None, num_processes=1, auth_generator=auth_generator)
++ pool.Pool(job_queue, num_processes=1, auth_generator=auth_generator)
+ assert auth_generator.called is True
+ auth_generator.assert_called_once_with(mock.ANY)
+
+ def test_session_is_called(self):
+ """Ensure that the session function is called."""
++ job_queue = queue.Queue()
+ session = mock.MagicMock()
+- pool.Pool(None, num_processes=1, session=session)
++ pool.Pool(job_queue, num_processes=1, session=session)
+ assert session.called is True
+ session.assert_called_once_with()
+
+diff --git a/tests/threaded/test_thread.py b/tests/threaded/test_thread.py
+index bb92f7f..fd7e96b 100644
+--- a/tests/threaded/test_thread.py
++++ b/tests/threaded/test_thread.py
+@@ -19,6 +19,8 @@ def _make_mocks():
+
+ def _initialize_a_session_thread(session=None, job_queue=None,
+ response_queue=None, exception_queue=None):
++ if job_queue is None:
++ job_queue = queue.Queue()
+ with mock.patch.object(threading, 'Thread') as Thread:
+ thread_instance = mock.MagicMock()
+ Thread.return_value = thread_instance
+@@ -52,10 +54,11 @@ def test_thread_initialization(self):
+
+ def test_is_alive_proxies_to_worker(self):
+ """Test that we proxy the is_alive method to the Thread."""
++ job_queue = queue.Queue()
+ with mock.patch.object(threading, 'Thread') as Thread:
+ thread_instance = mock.MagicMock()
+ Thread.return_value = thread_instance
+- st = thread.SessionThread(None, None, None, None)
++ st = thread.SessionThread(None, job_queue, None, None)
+
+ st.is_alive()
+ thread_instance.is_alive.assert_called_once_with()