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

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //lib64/python3.6/sched.py
"""A generally useful event scheduler class.

Each instance of this class manages its own queue.
No multi-threading is implied; you are supposed to hack that
yourself, or use a single instance per application.

Each instance is parametrized with two functions, one that is
supposed to return the current time, one that is supposed to
implement a delay.  You can implement real-time scheduling by
substituting time and sleep from built-in module time, or you can
implement simulated time by writing your own functions.  This can
also be used to integrate scheduling with STDWIN events; the delay
function is allowed to modify the queue.  Time can be expressed as
integers or floating point numbers, as long as it is consistent.

Events are specified by tuples (time, priority, action, argument, kwargs).
As in UNIX, lower priority numbers mean higher priority; in this
way the queue can be maintained as a priority queue.  Execution of the
event means calling the action function, passing it the argument
sequence in "argument" (remember that in Python, multiple function
arguments are be packed in a sequence) and keyword parameters in "kwargs".
The action function may be an instance method so it
has another way to reference private data (besides global variables).
"""

import time
import heapq
from collections import namedtuple
try:
    import threading
except ImportError:
    import dummy_threading as threading
from time import monotonic as _time

__all__ = ["scheduler"]

class Event(namedtuple('Event', 'time, priority, action, argument, kwargs')):
    __slots__ = []
    def __eq__(s, o): return (s.time, s.priority) == (o.time, o.priority)
    def __lt__(s, o): return (s.time, s.priority) <  (o.time, o.priority)
    def __le__(s, o): return (s.time, s.priority) <= (o.time, o.priority)
    def __gt__(s, o): return (s.time, s.priority) >  (o.time, o.priority)
    def __ge__(s, o): return (s.time, s.priority) >= (o.time, o.priority)

Event.time.__doc__ = ('''Numeric type compatible with the return value of the
timefunc function passed to the constructor.''')
Event.priority.__doc__ = ('''Events scheduled for the same time will be executed
in the order of their priority.''')
Event.action.__doc__ = ('''Executing the event means executing
action(*argument, **kwargs)''')
Event.argument.__doc__ = ('''argument is a sequence holding the positional
arguments for the action.''')
Event.kwargs.__doc__ = ('''kwargs is a dictionary holding the keyword
arguments for the action.''')

_sentinel = object()

class scheduler:

    def __init__(self, timefunc=_time, delayfunc=time.sleep):
        """Initialize a new instance, passing the time and delay
        functions"""
        self._queue = []
        self._lock = threading.RLock()
        self.timefunc = timefunc
        self.delayfunc = delayfunc

    def enterabs(self, time, priority, action, argument=(), kwargs=_sentinel):
        """Enter a new event in the queue at an absolute time.

        Returns an ID for the event which can be used to remove it,
        if necessary.

        """
        if kwargs is _sentinel:
            kwargs = {}
        event = Event(time, priority, action, argument, kwargs)
        with self._lock:
            heapq.heappush(self._queue, event)
        return event # The ID

    def enter(self, delay, priority, action, argument=(), kwargs=_sentinel):
        """A variant that specifies the time as a relative time.

        This is actually the more commonly used interface.

        """
        time = self.timefunc() + delay
        return self.enterabs(time, priority, action, argument, kwargs)

    def cancel(self, event):
        """Remove an event from the queue.

        This must be presented the ID as returned by enter().
        If the event is not in the queue, this raises ValueError.

        """
        with self._lock:
            self._queue.remove(event)
            heapq.heapify(self._queue)

    def empty(self):
        """Check whether the queue is empty."""
        with self._lock:
            return not self._queue

    def run(self, blocking=True):
        """Execute events until the queue is empty.
        If blocking is False executes the scheduled events due to
        expire soonest (if any) and then return the deadline of the
        next scheduled call in the scheduler.

        When there is a positive delay until the first event, the
        delay function is called and the event is left in the queue;
        otherwise, the event is removed from the queue and executed
        (its action function is called, passing it the argument).  If
        the delay function returns prematurely, it is simply
        restarted.

        It is legal for both the delay function and the action
        function to modify the queue or to raise an exception;
        exceptions are not caught but the scheduler's state remains
        well-defined so run() may be called again.

        A questionable hack is added to allow other threads to run:
        just after an event is executed, a delay of 0 is executed, to
        avoid monopolizing the CPU when other threads are also
        runnable.

        """
        # localize variable access to minimize overhead
        # and to improve thread safety
        lock = self._lock
        q = self._queue
        delayfunc = self.delayfunc
        timefunc = self.timefunc
        pop = heapq.heappop
        while True:
            with lock:
                if not q:
                    break
                time, priority, action, argument, kwargs = q[0]
                now = timefunc()
                if time > now:
                    delay = True
                else:
                    delay = False
                    pop(q)
            if delay:
                if not blocking:
                    return time - now
                delayfunc(time - now)
            else:
                action(*argument, **kwargs)
                delayfunc(0)   # Let other threads run

    @property
    def queue(self):
        """An ordered list of upcoming events.

        Events are named tuples with fields for:
            time, priority, action, arguments, kwargs

        """
        # Use heapq to sort the queue rather than using 'sorted(self._queue)'.
        # With heapq, two events scheduled at the same time will show in
        # the actual order they would be retrieved.
        with self._lock:
            events = self._queue[:]
        return list(map(heapq.heappop, [events]*len(events)))
Name
Size
Permissions
Options
__pycache__
--
drwxr-xr-x
asyncio
--
drwxr-xr-x
collections
--
drwxr-xr-x
concurrent
--
drwxr-xr-x
config-3.6m-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
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.728 KB
-rw-r--r--
__phello__.foo.py
0.063 KB
-rw-r--r--
_bootlocale.py
1.271 KB
-rw-r--r--
_collections_abc.py
25.773 KB
-rw-r--r--
_compat_pickle.py
8.544 KB
-rw-r--r--
_compression.py
5.215 KB
-rw-r--r--
_dummy_thread.py
4.998 KB
-rw-r--r--
_markupbase.py
14.256 KB
-rw-r--r--
_osx_support.py
18.689 KB
-rw-r--r--
_pydecimal.py
224.832 KB
-rw-r--r--
_pyio.py
86.032 KB
-rw-r--r--
_sitebuiltins.py
3.042 KB
-rw-r--r--
_strptime.py
24.167 KB
-rw-r--r--
_sysconfigdata_dm_linux_x86_64-linux-gnu.py
29.483 KB
-rw-r--r--
_sysconfigdata_m_linux_x86_64-linux-gnu.py
29.655 KB
-rw-r--r--
_threading_local.py
7.045 KB
-rw-r--r--
_weakrefset.py
5.571 KB
-rw-r--r--
abc.py
8.522 KB
-rw-r--r--
aifc.py
31.693 KB
-rw-r--r--
antigravity.py
0.466 KB
-rw-r--r--
argparse.py
88.254 KB
-rw-r--r--
ast.py
11.881 KB
-rw-r--r--
asynchat.py
11.063 KB
-rw-r--r--
asyncore.py
19.687 KB
-rw-r--r--
base64.py
19.91 KB
-rwxr-xr-x
bdb.py
23.004 KB
-rw-r--r--
binhex.py
13.627 KB
-rw-r--r--
bisect.py
2.534 KB
-rw-r--r--
bz2.py
12.186 KB
-rw-r--r--
cProfile.py
5.254 KB
-rwxr-xr-x
calendar.py
22.669 KB
-rw-r--r--
cgi.py
36.347 KB
-rwxr-xr-x
cgitb.py
11.736 KB
-rw-r--r--
chunk.py
5.298 KB
-rw-r--r--
cmd.py
14.512 KB
-rw-r--r--
code.py
10.365 KB
-rw-r--r--
codecs.py
35.426 KB
-rw-r--r--
codeop.py
5.854 KB
-rw-r--r--
colorsys.py
3.969 KB
-rw-r--r--
compileall.py
11.841 KB
-rw-r--r--
configparser.py
52.336 KB
-rw-r--r--
contextlib.py
12.854 KB
-rw-r--r--
copy.py
8.608 KB
-rw-r--r--
copyreg.py
6.843 KB
-rw-r--r--
crypt.py
1.82 KB
-rw-r--r--
csv.py
15.801 KB
-rw-r--r--
datetime.py
80.111 KB
-rw-r--r--
decimal.py
0.313 KB
-rw-r--r--
difflib.py
82.399 KB
-rw-r--r--
dis.py
17.707 KB
-rw-r--r--
doctest.py
101.944 KB
-rw-r--r--
dummy_threading.py
2.749 KB
-rw-r--r--
enum.py
32.818 KB
-rw-r--r--
filecmp.py
9.6 KB
-rw-r--r--
fileinput.py
14.132 KB
-rw-r--r--
fnmatch.py
3.092 KB
-rw-r--r--
formatter.py
14.788 KB
-rw-r--r--
fractions.py
23.085 KB
-rw-r--r--
ftplib.py
34.782 KB
-rw-r--r--
functools.py
30.611 KB
-rw-r--r--
genericpath.py
4.91 KB
-rw-r--r--
getopt.py
7.313 KB
-rw-r--r--
getpass.py
5.854 KB
-rw-r--r--
gettext.py
21.025 KB
-rw-r--r--
glob.py
5.506 KB
-rw-r--r--
gzip.py
19.857 KB
-rw-r--r--
hashlib.py
8.593 KB
-rw-r--r--
heapq.py
22.392 KB
-rw-r--r--
hmac.py
6.231 KB
-rw-r--r--
imaplib.py
52.046 KB
-rw-r--r--
imghdr.py
3.706 KB
-rw-r--r--
imp.py
10.419 KB
-rw-r--r--
inspect.py
114.217 KB
-rw-r--r--
io.py
3.435 KB
-rw-r--r--
ipaddress.py
75.994 KB
-rw-r--r--
keyword.py
2.167 KB
-rwxr-xr-x
linecache.py
5.188 KB
-rw-r--r--
locale.py
75.488 KB
-rw-r--r--
lzma.py
12.679 KB
-rw-r--r--
macpath.py
5.831 KB
-rw-r--r--
macurl2path.py
2.668 KB
-rw-r--r--
mailbox.py
76.781 KB
-rw-r--r--
mailcap.py
8.854 KB
-rw-r--r--
mimetypes.py
20.549 KB
-rw-r--r--
modulefinder.py
22.487 KB
-rw-r--r--
netrc.py
5.551 KB
-rw-r--r--
nntplib.py
42.068 KB
-rw-r--r--
ntpath.py
22.553 KB
-rw-r--r--
nturl2path.py
2.387 KB
-rw-r--r--
numbers.py
10.003 KB
-rw-r--r--
opcode.py
5.686 KB
-rw-r--r--
operator.py
10.608 KB
-rw-r--r--
optparse.py
58.956 KB
-rw-r--r--
os.py
36.646 KB
-rw-r--r--
pathlib.py
45.154 KB
-rw-r--r--
pdb.py
59.883 KB
-rwxr-xr-x
pickle.py
54.386 KB
-rw-r--r--
pickletools.py
89.624 KB
-rw-r--r--
pipes.py
8.707 KB
-rw-r--r--
pkgutil.py
20.815 KB
-rw-r--r--
platform.py
46.107 KB
-rwxr-xr-x
plistlib.py
31.534 KB
-rw-r--r--
poplib.py
14.613 KB
-rw-r--r--
posixpath.py
15.941 KB
-rw-r--r--
pprint.py
20.371 KB
-rw-r--r--
profile.py
21.513 KB
-rwxr-xr-x
pstats.py
25.941 KB
-rw-r--r--
pty.py
4.651 KB
-rw-r--r--
py_compile.py
7.013 KB
-rw-r--r--
pyclbr.py
13.24 KB
-rw-r--r--
pydoc.py
101.075 KB
-rw-r--r--
queue.py
8.574 KB
-rw-r--r--
quopri.py
7.092 KB
-rwxr-xr-x
random.py
26.799 KB
-rw-r--r--
re.py
15.188 KB
-rw-r--r--
reprlib.py
5.211 KB
-rw-r--r--
rlcompleter.py
6.931 KB
-rw-r--r--
runpy.py
11.679 KB
-rw-r--r--
sched.py
6.358 KB
-rw-r--r--
secrets.py
1.99 KB
-rw-r--r--
selectors.py
18.982 KB
-rw-r--r--
shelve.py
8.315 KB
-rw-r--r--
shlex.py
12.652 KB
-rw-r--r--
shutil.py
39.872 KB
-rw-r--r--
signal.py
2.073 KB
-rw-r--r--
site.py
20.77 KB
-rw-r--r--
smtpd.py
33.905 KB
-rwxr-xr-x
smtplib.py
43.182 KB
-rwxr-xr-x
sndhdr.py
6.922 KB
-rw-r--r--
socket.py
26.8 KB
-rw-r--r--
socketserver.py
26.377 KB
-rw-r--r--
sre_compile.py
18.885 KB
-rw-r--r--
sre_constants.py
6.661 KB
-rw-r--r--
sre_parse.py
35.68 KB
-rw-r--r--
ssl.py
43.466 KB
-rw-r--r--
stat.py
4.92 KB
-rw-r--r--
statistics.py
20.188 KB
-rw-r--r--
string.py
11.519 KB
-rw-r--r--
stringprep.py
12.614 KB
-rw-r--r--
struct.py
0.251 KB
-rw-r--r--
subprocess.py
60.878 KB
-rw-r--r--
sunau.py
17.671 KB
-rw-r--r--
symbol.py
2.069 KB
-rwxr-xr-x
symtable.py
7.106 KB
-rw-r--r--
sysconfig.py
24.293 KB
-rw-r--r--
tabnanny.py
11.144 KB
-rwxr-xr-x
tarfile.py
109.019 KB
-rwxr-xr-x
telnetlib.py
22.594 KB
-rw-r--r--
tempfile.py
27.408 KB
-rw-r--r--
textwrap.py
19.1 KB
-rw-r--r--
this.py
0.979 KB
-rw-r--r--
threading.py
48.961 KB
-rw-r--r--
timeit.py
13.029 KB
-rwxr-xr-x
token.py
3.003 KB
-rw-r--r--
tokenize.py
28.805 KB
-rw-r--r--
trace.py
28.06 KB
-rwxr-xr-x
traceback.py
22.908 KB
-rw-r--r--
tracemalloc.py
16.268 KB
-rw-r--r--
tty.py
0.858 KB
-rw-r--r--
types.py
8.662 KB
-rw-r--r--
typing.py
78.393 KB
-rw-r--r--
uu.py
6.604 KB
-rwxr-xr-x
uuid.py
23.457 KB
-rw-r--r--
warnings.py
18.055 KB
-rw-r--r--
wave.py
17.294 KB
-rw-r--r--
weakref.py
19.986 KB
-rw-r--r--
webbrowser.py
21.257 KB
-rwxr-xr-x
xdrlib.py
5.774 KB
-rw-r--r--
zipapp.py
6.989 KB
-rw-r--r--
zipfile.py
78.051 KB
-rw-r--r--