Psyduck - 可達鴨 之 鴨力山大2


Server : LiteSpeed
System : Linux premium217.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User : alloknri ( 880)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /opt/alt/python39/lib64/python3.9/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/alt/python39/lib64/python3.9/_threading_local.py
"""Thread-local objects.

(Note that this module provides a Python version of the threading.local
 class.  Depending on the version of Python you're using, there may be a
 faster one available.  You should always import the `local` class from
 `threading`.)

Thread-local objects support the management of thread-local data.
If you have data that you want to be local to a thread, simply create
a thread-local object and use its attributes:

  >>> mydata = local()
  >>> mydata.number = 42
  >>> mydata.number
  42

You can also access the local-object's dictionary:

  >>> mydata.__dict__
  {'number': 42}
  >>> mydata.__dict__.setdefault('widgets', [])
  []
  >>> mydata.widgets
  []

What's important about thread-local objects is that their data are
local to a thread. If we access the data in a different thread:

  >>> log = []
  >>> def f():
  ...     items = sorted(mydata.__dict__.items())
  ...     log.append(items)
  ...     mydata.number = 11
  ...     log.append(mydata.number)

  >>> import threading
  >>> thread = threading.Thread(target=f)
  >>> thread.start()
  >>> thread.join()
  >>> log
  [[], 11]

we get different data.  Furthermore, changes made in the other thread
don't affect data seen in this thread:

  >>> mydata.number
  42

Of course, values you get from a local object, including a __dict__
attribute, are for whatever thread was current at the time the
attribute was read.  For that reason, you generally don't want to save
these values across threads, as they apply only to the thread they
came from.

You can create custom local objects by subclassing the local class:

  >>> class MyLocal(local):
  ...     number = 2
  ...     def __init__(self, /, **kw):
  ...         self.__dict__.update(kw)
  ...     def squared(self):
  ...         return self.number ** 2

This can be useful to support default values, methods and
initialization.  Note that if you define an __init__ method, it will be
called each time the local object is used in a separate thread.  This
is necessary to initialize each thread's dictionary.

Now if we create a local object:

  >>> mydata = MyLocal(color='red')

Now we have a default number:

  >>> mydata.number
  2

an initial color:

  >>> mydata.color
  'red'
  >>> del mydata.color

And a method that operates on the data:

  >>> mydata.squared()
  4

As before, we can access the data in a separate thread:

  >>> log = []
  >>> thread = threading.Thread(target=f)
  >>> thread.start()
  >>> thread.join()
  >>> log
  [[('color', 'red')], 11]

without affecting this thread's data:

  >>> mydata.number
  2
  >>> mydata.color
  Traceback (most recent call last):
  ...
  AttributeError: 'MyLocal' object has no attribute 'color'

Note that subclasses can define slots, but they are not thread
local. They are shared across threads:

  >>> class MyLocal(local):
  ...     __slots__ = 'number'

  >>> mydata = MyLocal()
  >>> mydata.number = 42
  >>> mydata.color = 'red'

So, the separate thread:

  >>> thread = threading.Thread(target=f)
  >>> thread.start()
  >>> thread.join()

affects what we see:

  >>> mydata.number
  11

>>> del mydata
"""

from weakref import ref
from contextlib import contextmanager

__all__ = ["local"]

# We need to use objects from the threading module, but the threading
# module may also want to use our `local` class, if support for locals
# isn't compiled in to the `thread` module.  This creates potential problems
# with circular imports.  For that reason, we don't import `threading`
# until the bottom of this file (a hack sufficient to worm around the
# potential problems).  Note that all platforms on CPython do have support
# for locals in the `thread` module, and there is no circular import problem
# then, so problems introduced by fiddling the order of imports here won't
# manifest.

class _localimpl:
    """A class managing thread-local dicts"""
    __slots__ = 'key', 'dicts', 'localargs', 'locallock', '__weakref__'

    def __init__(self):
        # The key used in the Thread objects' attribute dicts.
        # We keep it a string for speed but make it unlikely to clash with
        # a "real" attribute.
        self.key = '_threading_local._localimpl.' + str(id(self))
        # { id(Thread) -> (ref(Thread), thread-local dict) }
        self.dicts = {}

    def get_dict(self):
        """Return the dict for the current thread. Raises KeyError if none
        defined."""
        thread = current_thread()
        return self.dicts[id(thread)][1]

    def create_dict(self):
        """Create a new dict for the current thread, and return it."""
        localdict = {}
        key = self.key
        thread = current_thread()
        idt = id(thread)
        def local_deleted(_, key=key):
            # When the localimpl is deleted, remove the thread attribute.
            thread = wrthread()
            if thread is not None:
                del thread.__dict__[key]
        def thread_deleted(_, idt=idt):
            # When the thread is deleted, remove the local dict.
            # Note that this is suboptimal if the thread object gets
            # caught in a reference loop. We would like to be called
            # as soon as the OS-level thread ends instead.
            local = wrlocal()
            if local is not None:
                dct = local.dicts.pop(idt)
        wrlocal = ref(self, local_deleted)
        wrthread = ref(thread, thread_deleted)
        thread.__dict__[key] = wrlocal
        self.dicts[idt] = wrthread, localdict
        return localdict


@contextmanager
def _patch(self):
    impl = object.__getattribute__(self, '_local__impl')
    try:
        dct = impl.get_dict()
    except KeyError:
        dct = impl.create_dict()
        args, kw = impl.localargs
        self.__init__(*args, **kw)
    with impl.locallock:
        object.__setattr__(self, '__dict__', dct)
        yield


class local:
    __slots__ = '_local__impl', '__dict__'

    def __new__(cls, /, *args, **kw):
        if (args or kw) and (cls.__init__ is object.__init__):
            raise TypeError("Initialization arguments are not supported")
        self = object.__new__(cls)
        impl = _localimpl()
        impl.localargs = (args, kw)
        impl.locallock = RLock()
        object.__setattr__(self, '_local__impl', impl)
        # We need to create the thread dict in anticipation of
        # __init__ being called, to make sure we don't call it
        # again ourselves.
        impl.create_dict()
        return self

    def __getattribute__(self, name):
        with _patch(self):
            return object.__getattribute__(self, name)

    def __setattr__(self, name, value):
        if name == '__dict__':
            raise AttributeError(
                "%r object attribute '__dict__' is read-only"
                % self.__class__.__name__)
        with _patch(self):
            return object.__setattr__(self, name, value)

    def __delattr__(self, name):
        if name == '__dict__':
            raise AttributeError(
                "%r object attribute '__dict__' is read-only"
                % self.__class__.__name__)
        with _patch(self):
            return object.__delattr__(self, name)


from threading import current_thread, RLock
Name
Size
Permissions
Options
__pycache__
--
drwxr-xr-x
asyncio
--
drwxr-xr-x
collections
--
drwxr-xr-x
concurrent
--
drwxr-xr-x
config-3.9-x86_64-linux-gnu
--
drwxr-xr-x
ctypes
--
drwxr-xr-x
curses
--
drwxr-xr-x
dbm
--
drwxr-xr-x
distutils
--
drwxr-xr-x
email
--
drwxr-xr-x
encodings
--
drwxr-xr-x
ensurepip
--
drwxr-xr-x
html
--
drwxr-xr-x
http
--
drwxr-xr-x
importlib
--
drwxr-xr-x
json
--
drwxr-xr-x
lib-dynload
--
drwxr-xr-x
lib2to3
--
drwxr-xr-x
logging
--
drwxr-xr-x
multiprocessing
--
drwxr-xr-x
pydoc_data
--
drwxr-xr-x
site-packages
--
drwxr-xr-x
sqlite3
--
drwxr-xr-x
unittest
--
drwxr-xr-x
urllib
--
drwxr-xr-x
venv
--
drwxr-xr-x
wsgiref
--
drwxr-xr-x
xml
--
drwxr-xr-x
xmlrpc
--
drwxr-xr-x
zoneinfo
--
drwxr-xr-x
LICENSE.txt
13.61 KB
-rw-r--r--
__future__.py
5.026 KB
-rw-r--r--
__phello__.foo.py
0.063 KB
-rw-r--r--
_aix_support.py
3.31 KB
-rw-r--r--
_bootlocale.py
1.759 KB
-rw-r--r--
_bootsubprocess.py
2.612 KB
-rw-r--r--
_collections_abc.py
28.686 KB
-rw-r--r--
_compat_pickle.py
8.544 KB
-rw-r--r--
_compression.py
5.215 KB
-rw-r--r--
_markupbase.py
14.28 KB
-rw-r--r--
_osx_support.py
21.263 KB
-rw-r--r--
_py_abc.py
6.044 KB
-rw-r--r--
_pydecimal.py
223.307 KB
-rw-r--r--
_pyio.py
91.129 KB
-rw-r--r--
_sitebuiltins.py
3.042 KB
-rw-r--r--
_strptime.py
24.685 KB
-rw-r--r--
_sysconfigdata__linux_x86_64-linux-gnu.py
39.586 KB
-rw-r--r--
_sysconfigdata_d_linux_x86_64-linux-gnu.py
39.328 KB
-rw-r--r--
_threading_local.py
7.051 KB
-rw-r--r--
_weakrefset.py
5.784 KB
-rw-r--r--
abc.py
4.805 KB
-rw-r--r--
aifc.py
31.841 KB
-rw-r--r--
antigravity.py
0.488 KB
-rw-r--r--
argparse.py
95.819 KB
-rw-r--r--
ast.py
54.938 KB
-rw-r--r--
asynchat.py
11.056 KB
-rw-r--r--
asyncore.py
19.631 KB
-rw-r--r--
base64.py
19.406 KB
-rwxr-xr-x
bdb.py
30.653 KB
-rw-r--r--
binhex.py
14.438 KB
-rw-r--r--
bisect.py
2.295 KB
-rw-r--r--
bz2.py
12.155 KB
-rw-r--r--
cProfile.py
6.209 KB
-rwxr-xr-x
calendar.py
24.25 KB
-rw-r--r--
cgi.py
33.149 KB
-rwxr-xr-x
cgitb.py
11.813 KB
-rw-r--r--
chunk.py
5.308 KB
-rw-r--r--
cmd.py
14.512 KB
-rw-r--r--
code.py
10.373 KB
-rw-r--r--
codecs.py
35.813 KB
-rw-r--r--
codeop.py
6.178 KB
-rw-r--r--
colorsys.py
3.969 KB
-rw-r--r--
compileall.py
19.634 KB
-rw-r--r--
configparser.py
53.305 KB
-rw-r--r--
contextlib.py
24.047 KB
-rw-r--r--
contextvars.py
0.126 KB
-rw-r--r--
copy.py
8.447 KB
-rw-r--r--
copyreg.py
7.104 KB
-rw-r--r--
crypt.py
3.729 KB
-rw-r--r--
csv.py
15.766 KB
-rw-r--r--
dataclasses.py
48.424 KB
-rw-r--r--
datetime.py
87.087 KB
-rw-r--r--
decimal.py
0.313 KB
-rw-r--r--
difflib.py
81.354 KB
-rw-r--r--
dis.py
20.088 KB
-rw-r--r--
doctest.py
102.117 KB
-rw-r--r--
enum.py
38.516 KB
-rw-r--r--
filecmp.py
9.789 KB
-rw-r--r--
fileinput.py
14.444 KB
-rw-r--r--
fnmatch.py
5.863 KB
-rw-r--r--
formatter.py
14.788 KB
-rw-r--r--
fractions.py
23.753 KB
-rw-r--r--
ftplib.py
34.664 KB
-rw-r--r--
functools.py
37.97 KB
-rw-r--r--
genericpath.py
5.123 KB
-rw-r--r--
getopt.py
7.313 KB
-rw-r--r--
getpass.py
5.85 KB
-rw-r--r--
gettext.py
26.627 KB
-rw-r--r--
glob.py
5.687 KB
-rw-r--r--
graphlib.py
9.349 KB
-rw-r--r--
gzip.py
21.262 KB
-rw-r--r--
hashlib.py
9.775 KB
-rw-r--r--
heapq.py
22.341 KB
-rw-r--r--
hmac.py
6.839 KB
-rw-r--r--
imaplib.py
53.961 KB
-rw-r--r--
imghdr.py
3.719 KB
-rw-r--r--
imp.py
10.289 KB
-rw-r--r--
inspect.py
115.464 KB
-rw-r--r--
io.py
3.458 KB
-rw-r--r--
ipaddress.py
79.027 KB
-rw-r--r--
keyword.py
1.022 KB
-rw-r--r--
linecache.py
5.333 KB
-rw-r--r--
locale.py
76.437 KB
-rw-r--r--
lzma.py
12.921 KB
-rw-r--r--
mailbox.py
76.947 KB
-rw-r--r--
mailcap.py
8.902 KB
-rw-r--r--
mimetypes.py
21.059 KB
-rw-r--r--
modulefinder.py
23.829 KB
-rw-r--r--
netrc.py
5.436 KB
-rw-r--r--
nntplib.py
40.062 KB
-rw-r--r--
ntpath.py
27.597 KB
-rw-r--r--
nturl2path.py
2.819 KB
-rw-r--r--
numbers.py
10.096 KB
-rw-r--r--
opcode.py
5.527 KB
-rw-r--r--
operator.py
10.499 KB
-rw-r--r--
optparse.py
58.954 KB
-rw-r--r--
os.py
38.149 KB
-rw-r--r--
pathlib.py
49.936 KB
-rw-r--r--
pdb.py
61.768 KB
-rwxr-xr-x
pickle.py
63.398 KB
-rw-r--r--
pickletools.py
91.295 KB
-rw-r--r--
pipes.py
8.707 KB
-rw-r--r--
pkgutil.py
23.707 KB
-rw-r--r--
platform.py
39.662 KB
-rwxr-xr-x
plistlib.py
27.586 KB
-rw-r--r--
poplib.py
14.842 KB
-rw-r--r--
posixpath.py
15.892 KB
-rw-r--r--
pprint.py
21.999 KB
-rw-r--r--
profile.py
22.357 KB
-rwxr-xr-x
pstats.py
28.639 KB
-rw-r--r--
pty.py
4.694 KB
-rw-r--r--
py_compile.py
8.011 KB
-rw-r--r--
pyclbr.py
14.897 KB
-rw-r--r--
pydoc.py
107.043 KB
-rwxr-xr-x
queue.py
11.227 KB
-rw-r--r--
quopri.py
7.108 KB
-rwxr-xr-x
random.py
30.746 KB
-rw-r--r--
re.py
15.489 KB
-rw-r--r--
reprlib.py
5.144 KB
-rw-r--r--
rlcompleter.py
7.469 KB
-rw-r--r--
runpy.py
12.777 KB
-rw-r--r--
sched.py
6.291 KB
-rw-r--r--
secrets.py
1.988 KB
-rw-r--r--
selectors.py
19.078 KB
-rw-r--r--
shelve.py
8.327 KB
-rw-r--r--
shlex.py
13.185 KB
-rw-r--r--
shutil.py
51.787 KB
-rw-r--r--
signal.py
2.381 KB
-rw-r--r--
site.py
21.332 KB
-rw-r--r--
smtpd.py
34.018 KB
-rwxr-xr-x
smtplib.py
44.354 KB
-rwxr-xr-x
sndhdr.py
6.933 KB
-rw-r--r--
socket.py
36.05 KB
-rw-r--r--
socketserver.py
26.656 KB
-rw-r--r--
sre_compile.py
27.317 KB
-rw-r--r--
sre_constants.py
7.009 KB
-rw-r--r--
sre_parse.py
39.823 KB
-rw-r--r--
ssl.py
51.299 KB
-rw-r--r--
stat.py
5.356 KB
-rw-r--r--
statistics.py
37.175 KB
-rw-r--r--
string.py
10.318 KB
-rw-r--r--
stringprep.py
12.614 KB
-rw-r--r--
struct.py
0.251 KB
-rw-r--r--
subprocess.py
81.605 KB
-rw-r--r--
sunau.py
17.732 KB
-rw-r--r--
symbol.py
2.228 KB
-rw-r--r--
symtable.py
7.72 KB
-rw-r--r--
sysconfig.py
24.33 KB
-rw-r--r--
tabnanny.py
11.151 KB
-rwxr-xr-x
tarfile.py
108.251 KB
-rwxr-xr-x
telnetlib.py
22.709 KB
-rw-r--r--
tempfile.py
27.308 KB
-rw-r--r--
textwrap.py
18.952 KB
-rw-r--r--
this.py
0.979 KB
-rw-r--r--
threading.py
52.906 KB
-rw-r--r--
timeit.py
13.177 KB
-rwxr-xr-x
token.py
2.313 KB
-rw-r--r--
tokenize.py
25.276 KB
-rw-r--r--
trace.py
28.535 KB
-rwxr-xr-x
traceback.py
24.082 KB
-rw-r--r--
tracemalloc.py
17.624 KB
-rw-r--r--
tty.py
0.858 KB
-rw-r--r--
types.py
9.556 KB
-rw-r--r--
typing.py
75.238 KB
-rw-r--r--
uu.py
7.106 KB
-rw-r--r--
uuid.py
26.684 KB
-rw-r--r--
warnings.py
19.227 KB
-rw-r--r--
wave.py
17.582 KB
-rw-r--r--
weakref.py
21.055 KB
-rw-r--r--
webbrowser.py
23.531 KB
-rwxr-xr-x
xdrlib.py
5.774 KB
-rw-r--r--
zipapp.py
7.358 KB
-rw-r--r--
zipfile.py
86.172 KB
-rw-r--r--
zipimport.py
30.044 KB
-rw-r--r--