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/python37/lib64/python3.7/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/alt/python37/lib64/python3.7/_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.7m
--
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
idlelib
--
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
test
--
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
__future__.py
4.981 KB
-rw-r--r--
__phello__.foo.py
0.063 KB
-rw-r--r--
_bootlocale.py
1.759 KB
-rw-r--r--
_collections_abc.py
25.805 KB
-rw-r--r--
_compat_pickle.py
8.544 KB
-rw-r--r--
_compression.py
5.215 KB
-rw-r--r--
_dummy_thread.py
5.886 KB
-rw-r--r--
_markupbase.py
14.256 KB
-rw-r--r--
_osx_support.py
19.141 KB
-rw-r--r--
_py_abc.py
6.041 KB
-rw-r--r--
_pydecimal.py
223.33 KB
-rw-r--r--
_pyio.py
89.469 KB
-rw-r--r--
_sitebuiltins.py
3.042 KB
-rw-r--r--
_strptime.py
24.906 KB
-rw-r--r--
_sysconfigdata_dm_linux_x86_64-linux-gnu.py
30.595 KB
-rw-r--r--
_sysconfigdata_m_linux_x86_64-linux-gnu.py
27.93 KB
-rw-r--r--
_threading_local.py
7.045 KB
-rw-r--r--
_weakrefset.py
5.546 KB
-rw-r--r--
abc.py
5.449 KB
-rw-r--r--
aifc.py
32.045 KB
-rw-r--r--
antigravity.py
0.466 KB
-rw-r--r--
argparse.py
93.137 KB
-rw-r--r--
ast.py
12.541 KB
-rw-r--r--
asynchat.py
11.063 KB
-rw-r--r--
asyncore.py
19.646 KB
-rw-r--r--
base64.py
19.915 KB
-rwxr-xr-x
bdb.py
30.986 KB
-rw-r--r--
binhex.py
13.627 KB
-rw-r--r--
bisect.py
2.497 KB
-rw-r--r--
bz2.py
12.119 KB
-rw-r--r--
cProfile.py
6.106 KB
-rwxr-xr-x
calendar.py
24.244 KB
-rw-r--r--
cgi.py
34.229 KB
-rwxr-xr-x
cgitb.py
11.736 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.757 KB
-rw-r--r--
codeop.py
6.128 KB
-rw-r--r--
colorsys.py
3.969 KB
-rw-r--r--
compileall.py
13.465 KB
-rw-r--r--
configparser.py
53.011 KB
-rw-r--r--
contextlib.py
24.183 KB
-rw-r--r--
contextvars.py
0.126 KB
-rw-r--r--
copy.py
8.648 KB
-rw-r--r--
copyreg.py
6.853 KB
-rw-r--r--
crypt.py
3.268 KB
-rw-r--r--
csv.py
15.801 KB
-rw-r--r--
dataclasses.py
48.359 KB
-rw-r--r--
datetime.py
84.516 KB
-rw-r--r--
decimal.py
0.313 KB
-rw-r--r--
difflib.py
82.415 KB
-rw-r--r--
dis.py
19.422 KB
-rw-r--r--
doctest.py
102.109 KB
-rw-r--r--
dummy_threading.py
2.749 KB
-rw-r--r--
enum.py
34.222 KB
-rw-r--r--
filecmp.py
9.6 KB
-rw-r--r--
fileinput.py
14.282 KB
-rw-r--r--
fnmatch.py
3.961 KB
-rw-r--r--
formatter.py
14.788 KB
-rw-r--r--
fractions.py
23.195 KB
-rw-r--r--
ftplib.py
34.783 KB
-rw-r--r--
functools.py
32.16 KB
-rw-r--r--
genericpath.py
4.797 KB
-rw-r--r--
getopt.py
7.313 KB
-rw-r--r--
getpass.py
5.854 KB
-rw-r--r--
gettext.py
21.452 KB
-rw-r--r--
glob.py
5.506 KB
-rw-r--r--
gzip.py
20.153 KB
-rw-r--r--
hashlib.py
9.311 KB
-rw-r--r--
heapq.py
22.478 KB
-rw-r--r--
hmac.py
6.364 KB
-rw-r--r--
imaplib.py
52.043 KB
-rw-r--r--
imghdr.py
3.706 KB
-rw-r--r--
imp.py
10.289 KB
-rw-r--r--
inspect.py
114.878 KB
-rw-r--r--
io.py
3.435 KB
-rw-r--r--
ipaddress.py
71.854 KB
-rw-r--r--
keyword.py
2.203 KB
-rwxr-xr-x
linecache.py
5.205 KB
-rw-r--r--
locale.py
76.358 KB
-rw-r--r--
lzma.py
12.679 KB
-rw-r--r--
macpath.py
5.979 KB
-rw-r--r--
mailbox.py
76.811 KB
-rw-r--r--
mailcap.py
8.854 KB
-rw-r--r--
mimetypes.py
20.992 KB
-rw-r--r--
modulefinder.py
22.495 KB
-rw-r--r--
netrc.py
5.436 KB
-rw-r--r--
nntplib.py
42.077 KB
-rw-r--r--
ntpath.py
21.816 KB
-rw-r--r--
nturl2path.py
2.523 KB
-rw-r--r--
numbers.py
10.004 KB
-rw-r--r--
opcode.py
5.688 KB
-rw-r--r--
operator.py
10.608 KB
-rw-r--r--
optparse.py
58.956 KB
-rw-r--r--
os.py
37.013 KB
-rw-r--r--
pathlib.py
49.149 KB
-rw-r--r--
pdb.py
61.04 KB
-rwxr-xr-x
pickle.py
56.635 KB
-rw-r--r--
pickletools.py
89.082 KB
-rw-r--r--
pipes.py
8.707 KB
-rw-r--r--
pkgutil.py
20.958 KB
-rw-r--r--
platform.py
45.893 KB
-rwxr-xr-x
plistlib.py
29.989 KB
-rw-r--r--
poplib.py
14.613 KB
-rw-r--r--
posixpath.py
15.401 KB
-rw-r--r--
pprint.py
20.395 KB
-rw-r--r--
profile.py
21.967 KB
-rwxr-xr-x
pstats.py
26.675 KB
-rw-r--r--
pty.py
4.651 KB
-rw-r--r--
py_compile.py
7.813 KB
-rw-r--r--
pyclbr.py
14.782 KB
-rw-r--r--
pydoc.py
103.395 KB
-rw-r--r--
queue.py
11.093 KB
-rw-r--r--
quopri.py
7.095 KB
-rwxr-xr-x
random.py
26.911 KB
-rw-r--r--
re.py
14.947 KB
-rw-r--r--
reprlib.py
5.144 KB
-rw-r--r--
rlcompleter.py
6.931 KB
-rw-r--r--
runpy.py
11.679 KB
-rw-r--r--
sched.py
6.291 KB
-rw-r--r--
secrets.py
1.99 KB
-rw-r--r--
selectors.py
18.126 KB
-rw-r--r--
shelve.py
8.327 KB
-rw-r--r--
shlex.py
12.793 KB
-rw-r--r--
shutil.py
40.967 KB
-rw-r--r--
signal.py
2.073 KB
-rw-r--r--
site.py
21.069 KB
-rw-r--r--
smtpd.py
33.908 KB
-rwxr-xr-x
smtplib.py
43.401 KB
-rwxr-xr-x
sndhdr.py
6.92 KB
-rw-r--r--
socket.py
26.825 KB
-rw-r--r--
socketserver.py
26.292 KB
-rw-r--r--
sre_compile.py
26.242 KB
-rw-r--r--
sre_constants.py
7.009 KB
-rw-r--r--
sre_parse.py
38.238 KB
-rw-r--r--
ssl.py
44.429 KB
-rw-r--r--
stat.py
5.265 KB
-rw-r--r--
statistics.py
20.167 KB
-rw-r--r--
string.py
11.293 KB
-rw-r--r--
stringprep.py
12.614 KB
-rw-r--r--
struct.py
0.251 KB
-rw-r--r--
subprocess.py
70.946 KB
-rw-r--r--
sunau.py
17.944 KB
-rw-r--r--
symbol.py
2.092 KB
-rwxr-xr-x
symtable.py
7.108 KB
-rw-r--r--
sysconfig.py
23.867 KB
-rw-r--r--
tabnanny.py
11.151 KB
-rwxr-xr-x
tarfile.py
90.503 KB
-rwxr-xr-x
telnetlib.py
22.593 KB
-rw-r--r--
tempfile.py
26.104 KB
-rw-r--r--
textwrap.py
18.952 KB
-rw-r--r--
this.py
0.979 KB
-rw-r--r--
threading.py
48.129 KB
-rw-r--r--
timeit.py
13.177 KB
-rwxr-xr-x
token.py
3.675 KB
-rw-r--r--
tokenize.py
26.397 KB
-rw-r--r--
trace.py
28.226 KB
-rwxr-xr-x
traceback.py
22.888 KB
-rw-r--r--
tracemalloc.py
16.676 KB
-rw-r--r--
tty.py
0.858 KB
-rw-r--r--
types.py
9.665 KB
-rw-r--r--
typing.py
55.115 KB
-rw-r--r--
uu.py
7.106 KB
-rw-r--r--
uuid.py
28.826 KB
-rw-r--r--
warnings.py
19.609 KB
-rw-r--r--
wave.py
17.803 KB
-rw-r--r--
weakref.py
21.004 KB
-rw-r--r--
webbrowser.py
23.159 KB
-rwxr-xr-x
xdrlib.py
5.774 KB
-rw-r--r--
zipapp.py
7.358 KB
-rw-r--r--
zipfile.py
79.193 KB
-rw-r--r--