diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-04-19 20:59:51 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-19 20:59:51 (GMT) |
commit | 1e62bf145b4865d03a29a5720a4eb84c321a9829 (patch) | |
tree | ad044e2a1c08a2686ece7b7a9951105ff76e6df7 /Lib/tempfile.py | |
parent | 66bffd1663489d080349debbf1b472d432351038 (diff) | |
download | cpython-1e62bf145b4865d03a29a5720a4eb84c321a9829.zip cpython-1e62bf145b4865d03a29a5720a4eb84c321a9829.tar.gz cpython-1e62bf145b4865d03a29a5720a4eb84c321a9829.tar.bz2 |
bpo-30030: Revert f50354ad (tempfile) (#1187)
Revert f50354adaaafebe95ad09d09b825804a686ea843: it introduced a
regression in test_threadedtempfile.
Diffstat (limited to 'Lib/tempfile.py')
-rw-r--r-- | Lib/tempfile.py | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 6112208..6146235 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -133,21 +133,32 @@ def _sanitize_params(prefix, suffix, dir): return prefix, suffix, dir, output_type -def _RandomNameSequence(): - """Generate an endless sequence of unpredictable strings which - can safely be incorporated into file names. Each string is 8 - characters long. Multiple threads and forked processes can - safely use the same instance at the same time.""" +class _RandomNameSequence: + """An instance of _RandomNameSequence generates an endless + sequence of unpredictable strings which can safely be incorporated + into file names. Each string is six characters long. Multiple + threads can safely use the same instance at the same time. + + _RandomNameSequence is an iterator.""" characters = "abcdefghijklmnopqrstuvwxyz0123456789_" - rng_pid = None - while True: + + @property + def rng(self): cur_pid = _os.getpid() - if cur_pid != rng_pid: - choose = _Random().choice - rng_pid = cur_pid - letters = [choose(characters) for dummy in range(8)] - yield ''.join(letters) + 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 + 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 |