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

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/alt/python33/lib64/python3.3/_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
  ...     initialized = False
  ...     def __init__(self, **kw):
  ...         if self.initialized:
  ...             raise SystemError('__init__ called too many times')
  ...         self.initialized = True
  ...         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'), ('initialized', True)], 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
collections
--
drwxr-xr-x
concurrent
--
drwxr-xr-x
config-3.3m
--
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
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
plat-linux
--
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.477 KB
-rw-r--r--
__phello__.foo.py
0.063 KB
-rw-r--r--
_compat_pickle.py
4.236 KB
-rw-r--r--
_dummy_thread.py
4.657 KB
-rw-r--r--
_markupbase.py
14.256 KB
-rw-r--r--
_osx_support.py
18.413 KB
-rw-r--r--
_pyio.py
71.196 KB
-rw-r--r--
_strptime.py
21.166 KB
-rw-r--r--
_sysconfigdata.py
22.307 KB
-rw-r--r--
_threading_local.py
7.236 KB
-rw-r--r--
_weakrefset.py
5.571 KB
-rw-r--r--
abc.py
7.868 KB
-rw-r--r--
aifc.py
30.326 KB
-rw-r--r--
antigravity.py
0.464 KB
-rw-r--r--
argparse.py
86.981 KB
-rw-r--r--
ast.py
11.857 KB
-rw-r--r--
asynchat.py
11.316 KB
-rw-r--r--
asyncore.py
20.267 KB
-rw-r--r--
base64.py
13.658 KB
-rwxr-xr-x
bdb.py
21.381 KB
-rw-r--r--
binhex.py
13.387 KB
-rw-r--r--
bisect.py
2.534 KB
-rw-r--r--
bz2.py
18.04 KB
-rw-r--r--
cProfile.py
6.212 KB
-rwxr-xr-x
calendar.py
22.402 KB
-rw-r--r--
cgi.py
34.721 KB
-rwxr-xr-x
cgitb.py
11.759 KB
-rw-r--r--
chunk.py
5.251 KB
-rw-r--r--
cmd.py
14.512 KB
-rw-r--r--
code.py
9.795 KB
-rw-r--r--
codecs.py
35.113 KB
-rw-r--r--
codeop.py
5.854 KB
-rw-r--r--
colorsys.py
3.604 KB
-rw-r--r--
compileall.py
9.515 KB
-rw-r--r--
configparser.py
48.278 KB
-rw-r--r--
contextlib.py
8.911 KB
-rw-r--r--
copy.py
8.78 KB
-rw-r--r--
copyreg.py
6.456 KB
-rw-r--r--
crypt.py
1.835 KB
-rw-r--r--
csv.py
15.806 KB
-rw-r--r--
datetime.py
73.197 KB
-rw-r--r--
decimal.py
223.201 KB
-rw-r--r--
difflib.py
80.585 KB
-rw-r--r--
dis.py
9.896 KB
-rw-r--r--
doctest.py
100.521 KB
-rw-r--r--
dummy_threading.py
2.749 KB
-rw-r--r--
filecmp.py
9.372 KB
-rw-r--r--
fileinput.py
13.922 KB
-rw-r--r--
fnmatch.py
3.089 KB
-rw-r--r--
formatter.py
14.58 KB
-rw-r--r--
fractions.py
22.493 KB
-rw-r--r--
ftplib.py
39.31 KB
-rw-r--r--
functools.py
13.277 KB
-rw-r--r--
genericpath.py
3.021 KB
-rw-r--r--
getopt.py
7.313 KB
-rw-r--r--
getpass.py
5.657 KB
-rw-r--r--
gettext.py
20.153 KB
-rw-r--r--
glob.py
2.771 KB
-rw-r--r--
gzip.py
23.831 KB
-rw-r--r--
hashlib.py
6.048 KB
-rw-r--r--
heapq.py
17.575 KB
-rw-r--r--
hmac.py
4.336 KB
-rw-r--r--
imaplib.py
48.937 KB
-rw-r--r--
imghdr.py
3.445 KB
-rw-r--r--
imp.py
9.499 KB
-rw-r--r--
inspect.py
77.109 KB
-rw-r--r--
io.py
3.203 KB
-rw-r--r--
ipaddress.py
68.655 KB
-rw-r--r--
keyword.py
2.012 KB
-rwxr-xr-x
linecache.py
3.773 KB
-rw-r--r--
locale.py
91.03 KB
-rw-r--r--
lzma.py
17.045 KB
-rw-r--r--
macpath.py
5.485 KB
-rw-r--r--
macurl2path.py
2.668 KB
-rw-r--r--
mailbox.py
77.239 KB
-rw-r--r--
mailcap.py
7.263 KB
-rw-r--r--
mimetypes.py
20.249 KB
-rw-r--r--
modulefinder.py
22.654 KB
-rw-r--r--
netrc.py
5.612 KB
-rw-r--r--
nntplib.py
41.783 KB
-rw-r--r--
ntpath.py
19.958 KB
-rw-r--r--
nturl2path.py
2.34 KB
-rw-r--r--
numbers.py
10.154 KB
-rw-r--r--
opcode.py
4.979 KB
-rw-r--r--
optparse.py
58.932 KB
-rw-r--r--
os.py
33.964 KB
-rw-r--r--
os2emxpath.py
4.55 KB
-rw-r--r--
pdb.py
59.231 KB
-rwxr-xr-x
pickle.py
46.736 KB
-rw-r--r--
pickletools.py
79.442 KB
-rw-r--r--
pipes.py
8.707 KB
-rw-r--r--
pkgutil.py
21.034 KB
-rw-r--r--
platform.py
49.553 KB
-rwxr-xr-x
plistlib.py
14.431 KB
-rw-r--r--
poplib.py
11.105 KB
-rw-r--r--
posixpath.py
13.92 KB
-rw-r--r--
pprint.py
12.402 KB
-rw-r--r--
profile.py
20.945 KB
-rwxr-xr-x
pstats.py
25.754 KB
-rw-r--r--
pty.py
4.937 KB
-rw-r--r--
py_compile.py
6.56 KB
-rw-r--r--
pyclbr.py
13.123 KB
-rw-r--r--
pydoc.py
99.262 KB
-rwxr-xr-x
queue.py
8.628 KB
-rw-r--r--
quopri.py
7.144 KB
-rwxr-xr-x
random.py
25.059 KB
-rw-r--r--
re.py
14.622 KB
-rw-r--r--
reprlib.py
4.99 KB
-rw-r--r--
rlcompleter.py
5.396 KB
-rw-r--r--
runpy.py
10.169 KB
-rw-r--r--
sched.py
6.249 KB
-rw-r--r--
shelve.py
8.05 KB
-rw-r--r--
shlex.py
11.232 KB
-rw-r--r--
shutil.py
38.229 KB
-rw-r--r--
site.py
21.456 KB
-rw-r--r--
smtpd.py
29.499 KB
-rwxr-xr-x
smtplib.py
37.13 KB
-rwxr-xr-x
sndhdr.py
6.073 KB
-rw-r--r--
socket.py
14.563 KB
-rw-r--r--
socketserver.py
23.629 KB
-rw-r--r--
sre_compile.py
15.962 KB
-rw-r--r--
sre_constants.py
7.062 KB
-rw-r--r--
sre_parse.py
29.504 KB
-rw-r--r--
ssl.py
23.904 KB
-rw-r--r--
stat.py
4.203 KB
-rw-r--r--
string.py
9.189 KB
-rw-r--r--
stringprep.py
12.614 KB
-rw-r--r--
struct.py
0.232 KB
-rw-r--r--
subprocess.py
65.994 KB
-rw-r--r--
sunau.py
17.112 KB
-rw-r--r--
symbol.py
2.003 KB
-rwxr-xr-x
symtable.py
7.21 KB
-rw-r--r--
sysconfig.py
24.584 KB
-rw-r--r--
tabnanny.py
11.143 KB
-rwxr-xr-x
tarfile.py
86.781 KB
-rwxr-xr-x
telnetlib.py
26.708 KB
-rw-r--r--
tempfile.py
22.474 KB
-rw-r--r--
textwrap.py
16.102 KB
-rw-r--r--
this.py
0.979 KB
-rw-r--r--
threading.py
44.571 KB
-rw-r--r--
timeit.py
12.104 KB
-rwxr-xr-x
token.py
2.963 KB
-rw-r--r--
tokenize.py
24.293 KB
-rw-r--r--
trace.py
30.749 KB
-rwxr-xr-x
traceback.py
11.701 KB
-rw-r--r--
tty.py
0.858 KB
-rw-r--r--
types.py
3.093 KB
-rw-r--r--
uu.py
6.607 KB
-rwxr-xr-x
uuid.py
21.825 KB
-rw-r--r--
warnings.py
13.501 KB
-rw-r--r--
wave.py
18.144 KB
-rw-r--r--
weakref.py
11.226 KB
-rw-r--r--
webbrowser.py
22.376 KB
-rwxr-xr-x
xdrlib.py
5.255 KB
-rw-r--r--
zipfile.py
64.867 KB
-rw-r--r--