summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2017-09-03 21:52:20 (GMT)
committerGitHub <noreply@github.com>2017-09-03 21:52:20 (GMT)
commit7d8282d25d4900dd3367daf28bb393be7f276729 (patch)
tree383ae254bfd9d6290ff0f7779cf4dd8fed20b6bb
parent31b8efeaa893e95358b71eb2b8365552d3966b4a (diff)
downloadcpython-7d8282d25d4900dd3367daf28bb393be7f276729.zip
cpython-7d8282d25d4900dd3367daf28bb393be7f276729.tar.gz
cpython-7d8282d25d4900dd3367daf28bb393be7f276729.tar.bz2
[3.6] bpo-29212: Fix the ugly repr() ThreadPoolExecutor thread name. (GH-2315) (#3276)
bpo-29212: Fix the ugly ThreadPoolExecutor thread name. Fixes the newly introduced ugly default thread name for concurrent.futures thread.ThreadPoolExecutor threads. They'll now resemble the old <=3.5 threading default Thread-x names by being named ThreadPoolExecutor-y_n.. (cherry picked from commit a3d91b43c2851312fb942f31afa12f5961706db6)
-rw-r--r--Lib/concurrent/futures/thread.py8
-rw-r--r--Lib/test/test_concurrent_futures.py7
-rw-r--r--Misc/NEWS.d/next/Library/2017-09-03-14-31-00.bpo-29212.bicycl.rst3
3 files changed, 13 insertions, 5 deletions
diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py
index 5ade790..0b5d537 100644
--- a/Lib/concurrent/futures/thread.py
+++ b/Lib/concurrent/futures/thread.py
@@ -7,6 +7,7 @@ __author__ = 'Brian Quinlan (brian@sweetapp.com)'
import atexit
from concurrent.futures import _base
+import itertools
import queue
import threading
import weakref
@@ -83,6 +84,10 @@ def _worker(executor_reference, work_queue):
_base.LOGGER.critical('Exception in worker', exc_info=True)
class ThreadPoolExecutor(_base.Executor):
+
+ # Used to assign unique thread names when thread_name_prefix is not supplied.
+ _counter = itertools.count().__next__
+
def __init__(self, max_workers=None, thread_name_prefix=''):
"""Initializes a new ThreadPoolExecutor instance.
@@ -103,7 +108,8 @@ class ThreadPoolExecutor(_base.Executor):
self._threads = set()
self._shutdown = False
self._shutdown_lock = threading.Lock()
- self._thread_name_prefix = thread_name_prefix
+ self._thread_name_prefix = (thread_name_prefix or
+ ("ThreadPoolExecutor-%d" % self._counter()))
def submit(self, fn, *args, **kwargs):
with self._shutdown_lock:
diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py
index 9b61cc0..03f8d1d 100644
--- a/Lib/test/test_concurrent_futures.py
+++ b/Lib/test/test_concurrent_futures.py
@@ -191,10 +191,9 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase
del executor
for t in threads:
- # We don't particularly care what the default name is, just that
- # it has a default name implying that it is a ThreadPoolExecutor
- # followed by what looks like a thread number.
- self.assertRegex(t.name, r'^.*ThreadPoolExecutor.*_[0-4]$')
+ # Ensure that our default name is reasonably sane and unique when
+ # no thread_name_prefix was supplied.
+ self.assertRegex(t.name, r'ThreadPoolExecutor-\d+_[0-4]$')
t.join()
diff --git a/Misc/NEWS.d/next/Library/2017-09-03-14-31-00.bpo-29212.bicycl.rst b/Misc/NEWS.d/next/Library/2017-09-03-14-31-00.bpo-29212.bicycl.rst
new file mode 100644
index 0000000..ad4e939
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2017-09-03-14-31-00.bpo-29212.bicycl.rst
@@ -0,0 +1,3 @@
+Fix concurrent.futures.thread.ThreadPoolExecutor threads to have a non repr()
+based thread name by default when no thread_name_prefix is supplied. They will
+now identify themselves as "ThreadPoolExecutor-y_n".