Skip to content

Commit 8e409ce

Browse files
authored
bpo-42160: tempfile: Reduce overhead of pid check. (GH-22997)
The _RandomSequence class in tempfile used to check the current pid every time its rng property was used. This commit replaces this code with `os.register_at_fork` to reduce the overhead.
1 parent 9129af6 commit 8e409ce

File tree

3 files changed

+13
-14
lines changed

3 files changed

+13
-14
lines changed

Lib/tempfile.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,24 +129,22 @@ class _RandomNameSequence:
129129
130130
_RandomNameSequence is an iterator."""
131131

132-
characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
133-
134-
@property
135-
def rng(self):
136-
cur_pid = _os.getpid()
137-
if cur_pid != getattr(self, '_rng_pid', None):
138-
self._rng = _Random()
139-
self._rng_pid = cur_pid
140-
return self._rng
132+
def __init__(self, characters="abcdefghijklmnopqrstuvwxyz0123456789_", length=8, rng=None):
133+
if rng is None:
134+
rng = _Random()
135+
if hasattr(_os, "fork"):
136+
# prevent same state after fork
137+
_os.register_at_fork(after_in_child=rng.seed)
138+
self.rng = rng
139+
self.characters = characters
140+
self.length = length
141141

142142
def __iter__(self):
143143
return self
144144

145145
def __next__(self):
146146
c = self.characters
147-
choose = self.rng.choice
148-
letters = [choose(c) for dummy in range(8)]
149-
return ''.join(letters)
147+
return ''.join(self.rng.choices(c, k=self.length))
150148

151149
def _candidate_tempdir_list():
152150
"""Generate a list of candidate temporary directories which

Lib/test/test_tempfile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ def setUp(self):
153153
self.r = tempfile._RandomNameSequence()
154154
super().setUp()
155155

156-
def test_get_six_char_str(self):
157-
# _RandomNameSequence returns a six-character string
156+
def test_get_eight_char_str(self):
157+
# _RandomNameSequence returns a eight-character string
158158
s = next(self.r)
159159
self.nameCheck(s, '', '', '')
160160

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Replaced pid check in ``tempfile._RandomNameSequence`` with ``os.register_at_fork`` to reduce overhead.

0 commit comments

Comments
 (0)