/opt/imh/python3.13/lib/python3.13
NameSizeModeActions
asyncio/-0755rm
collections/-0755rm
concurrent/-0755rm
config-3.13-x86_64-linux-gnu/-0755rm
ctypes/-0755rm
curses/-0755rm
dbm/-0755rm
email/-0755rm
encodings/-0755rm
ensurepip/-0755rm
html/-0755rm
http/-0755rm
idlelib/-0755rm
importlib/-0755rm
json/-0755rm
lib-dynload/-0755rm
logging/-0755rm
multiprocessing/-0755rm
pathlib/-0755rm
pydoc_data/-0755rm
re/-0755rm
site-packages/-0755rm
sqlite3/-0755rm
sysconfig/-0755rm
tkinter/-0755rm
tomllib/-0755rm
turtledemo/-0755rm
unittest/-0755rm
urllib/-0755rm
venv/-0755rm
wsgiref/-0755rm
xml/-0755rm
xmlrpc/-0755rm
zipfile/-0755rm
zoneinfo/-0755rm
_pyrepl/-0755rm
__phello__/-0755rm
__pycache__/-0755rm
abc.py65380644editdlrm
antigravity.py5000644editdlrm
argparse.py1016610644editdlrm
ast.py653390644editdlrm
base64.py216300755editdlrm
bdb.py353430644editdlrm
bisect.py34230644editdlrm
bz2.py119690644editdlrm
calendar.py260770644editdlrm
cmd.py153160644editdlrm
code.py131700644editdlrm
codecs.py369780644editdlrm
codeop.py58280644editdlrm
colorsys.py40620644editdlrm
compileall.py206650644editdlrm
configparser.py538310644editdlrm
contextlib.py278010644editdlrm
contextvars.py1290644editdlrm
copy.py89750644editdlrm
copyreg.py76140644editdlrm
cProfile.py66240755editdlrm
csv.py191780644editdlrm
dataclasses.py645450644editdlrm
datetime.py2680644editdlrm
decimal.py27980644editdlrm
difflib.py833670644editdlrm
dis.py409620644editdlrm
doctest.py1094140644editdlrm
enum.py855930644editdlrm
filecmp.py106520644editdlrm
fileinput.py157170644editdlrm
fnmatch.py61800644editdlrm
fractions.py400900644editdlrm
ftplib.py347350644editdlrm
functools.py391230644editdlrm
genericpath.py62470644editdlrm
getopt.py74880644editdlrm
getpass.py62330644editdlrm
gettext.py215340644editdlrm
glob.py197200644editdlrm
graphlib.py96480644editdlrm
gzip.py246330644editdlrm
hashlib.py94460644editdlrm
heapq.py230240644editdlrm
hmac.py77160644editdlrm
imaplib.py540400644editdlrm
inspect.py1282760644editdlrm
io.py35820644editdlrm
ipaddress.py816350644editdlrm
keyword.py10730644editdlrm
LICENSE.txt138090644editdlrm
linecache.py72840644editdlrm
locale.py790330644editdlrm
lzma.py133990644editdlrm
mailbox.py816440644editdlrm
mimetypes.py238510644editdlrm
modulefinder.py237920644editdlrm
netrc.py70310644editdlrm
ntpath.py328060644editdlrm
nturl2path.py23740644editdlrm
numbers.py117690644editdlrm
opcode.py28250644editdlrm
operator.py109800644editdlrm
optparse.py603690644editdlrm
os.py416270644editdlrm
pdb.py909250755editdlrm
pickle.py669570644editdlrm
pickletools.py940520644editdlrm
pkgutil.py182810644editdlrm
platform.py473450755editdlrm
plistlib.py297940644editdlrm
poplib.py146040644editdlrm
posixpath.py183600644editdlrm
pprint.py241580644editdlrm
profile.py231400755editdlrm
pstats.py292960644editdlrm
pty.py61370644editdlrm
pyclbr.py113960644editdlrm
pydoc.py1100640755editdlrm
py_compile.py78370644editdlrm
queue.py134550644editdlrm
quopri.py71840755editdlrm
random.py370060644editdlrm
reprlib.py80680644editdlrm
rlcompleter.py79180644editdlrm
runpy.py128850644editdlrm
sched.py63510644editdlrm
secrets.py19840644editdlrm
selectors.py194570644editdlrm
shelve.py88100644editdlrm
shlex.py133530644editdlrm
shutil.py574630644editdlrm
signal.py24950644editdlrm
site.py255680644editdlrm
smtplib.py435320755editdlrm
socket.py377590644editdlrm
socketserver.py280650644editdlrm
sre_compile.py2310644editdlrm
sre_constants.py2320644editdlrm
sre_parse.py2290644editdlrm
ssl.py527060644editdlrm
stat.py61470644editdlrm
statistics.py618310644editdlrm
string.py117860644editdlrm
stringprep.py129170644editdlrm
struct.py2570644editdlrm
subprocess.py894860644editdlrm
symtable.py142070644editdlrm
tabnanny.py115320755editdlrm
tarfile.py1142390755editdlrm
tempfile.py324060644editdlrm
textwrap.py199390644editdlrm
this.py10030644editdlrm
threading.py553000644editdlrm
timeit.py134640755editdlrm
token.py24890644editdlrm
tokenize.py215680644editdlrm
trace.py297140755editdlrm
traceback.py665240644editdlrm
tracemalloc.py180470644editdlrm
tty.py20350644editdlrm
turtle.py1452150644editdlrm
types.py112070644editdlrm
typing.py1327180644editdlrm
uuid.py294580644editdlrm
warnings.py269480644editdlrm
wave.py232540644editdlrm
weakref.py215130644editdlrm
webbrowser.py242850755editdlrm
zipapp.py86180644editdlrm
zipimport.py328900644editdlrm
_aix_support.py40210644editdlrm
_android_support.py68950644editdlrm
_apple_support.py22560644editdlrm
_collections_abc.py322640644editdlrm
_colorize.py28480644editdlrm
_compat_pickle.py87350644editdlrm
_compression.py56810644editdlrm
_ios_support.py26720644editdlrm
_markupbase.py146530644editdlrm
_opcode_metadata.py92650644editdlrm
_osx_support.py220230644editdlrm
_pydatetime.py919830644editdlrm
_pydecimal.py2272860644editdlrm
_pyio.py936930644editdlrm
_pylong.py118300644editdlrm
_py_abc.py61890644editdlrm
_sitebuiltins.py31280644editdlrm
_strptime.py347340644editdlrm
_sysconfigdata__linux_x86_64-linux-gnu.py450210644editdlrm
_threading_local.py43630644editdlrm
_weakrefset.py58930644editdlrm
__future__.py52180644editdlrm
__hello__.py2270644editdlrm
Edit: /opt/imh/python3.13/lib/python3.13/sched.py (6351B)
"""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 from itertools import count import threading from time import monotonic as _time __all__ = ["scheduler"] Event = namedtuple('Event', 'time, priority, sequence, action, argument, kwargs') 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.sequence.__doc__ = ('''A continually increasing sequence number that separates events if time and priority are equal.''') 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 self._sequence_generator = count() 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 = {} with self._lock: event = Event(time, priority, next(self._sequence_generator), action, argument, kwargs) 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, sequence, 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)))