[Python-checkins] Revert "bpo-42160: tempfile: Reduce overhead of pid check. (GH-22997)"

methane webhook-mailer at python.org
Fri Oct 30 22:15:46 EDT 2020


https://github.com/python/cpython/commit/43ca084c88d1e46a44199f347c72e26db84903c9
commit: 43ca084c88d1e46a44199f347c72e26db84903c9
branch: master
author: Inada Naoki <songofacandy at gmail.com>
committer: methane <songofacandy at gmail.com>
date: 2020-10-31T11:15:38+09:00
summary:

Revert "bpo-42160: tempfile: Reduce overhead of pid check. (GH-22997)"

`_RandomNameSequence` is not true singleton so using `os.register_at_fork` doesn't make sense unlike `random._inst`.

This reverts commit 8e409cebad42032bb7d0f2cadd8b1e36081d98af.

files:
D Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst
M Lib/tempfile.py
M Lib/test/test_tempfile.py

diff --git a/Lib/tempfile.py b/Lib/tempfile.py
index 1bc5c71fd0349..770f72c25295c 100644
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -129,22 +129,24 @@ class _RandomNameSequence:
 
     _RandomNameSequence is an iterator."""
 
-    def __init__(self, characters="abcdefghijklmnopqrstuvwxyz0123456789_", length=8, rng=None):
-        if rng is None:
-            rng = _Random()
-        if hasattr(_os, "fork"):
-            # prevent same state after fork
-            _os.register_at_fork(after_in_child=rng.seed)
-        self.rng = rng
-        self.characters = characters
-        self.length = length
+    characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
+
+    @property
+    def rng(self):
+        cur_pid = _os.getpid()
+        if cur_pid != getattr(self, '_rng_pid', None):
+            self._rng = _Random()
+            self._rng_pid = cur_pid
+        return self._rng
 
     def __iter__(self):
         return self
 
     def __next__(self):
         c = self.characters
-        return ''.join(self.rng.choices(c, k=self.length))
+        choose = self.rng.choice
+        letters = [choose(c) for dummy in range(8)]
+        return ''.join(letters)
 
 def _candidate_tempdir_list():
     """Generate a list of candidate temporary directories which
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index 77d710efaf107..8ace883d74bb2 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -153,8 +153,8 @@ def setUp(self):
         self.r = tempfile._RandomNameSequence()
         super().setUp()
 
-    def test_get_eight_char_str(self):
-        # _RandomNameSequence returns a eight-character string
+    def test_get_six_char_str(self):
+        # _RandomNameSequence returns a six-character string
         s = next(self.r)
         self.nameCheck(s, '', '', '')
 
diff --git a/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst b/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst
deleted file mode 100644
index c5f3091283a87..0000000000000
--- a/Misc/NEWS.d/next/Library/2020-10-27-00-42-09.bpo-42160.eiLOCi.rst
+++ /dev/null
@@ -1 +0,0 @@
-Replaced pid check in ``tempfile._RandomNameSequence`` with ``os.register_at_fork`` to reduce overhead.



More information about the Python-checkins mailing list