rust-py-scheduler
Lightweight, performant task scheduler for Python applications, with a Rust core.
Register interval-based jobs ("10s", "5m", "1h") or cron jobs ("0 9 * * 1-5") with a plain function call or a decorator, run them in-process or on a background thread, and inspect their state (run/error counts, last error, next run time) at any point — without a database or an external broker. First-class FastAPI, Django, and Celery integrations are included.
Features
Scheduler— simple API:every(),cron(),list_jobs(),remove_job(),run(),start_background(),shutdown()- Two ways to register a job — a direct call (
scheduler.every("5s", fn)) or a decorator (@scheduler.every("5s")); both return the same registration - Interval scheduling —
"10s","5m","1h"(seconds/minutes/hours) - Cron scheduling — standard 5-field Unix expressions, e.g.
scheduler.cron("0 9 * * 1-5", fn)for weekdays at 9am - Framework integrations — start/stop with the app lifecycle on FastAPI and Django, and trigger Celery tasks on a schedule
- Run in-process or in the background — block the calling thread with
run(), or callstart_background()to schedule on a dedicated OS thread and keep going - Per-job retries with backoff —
max_retries=Nretries a failing job up toNextra times, waitingretry_backoff(default 0.5s) doubled per attempt, capped at 30s and jittered - Worker pool — callbacks run on
max_workersthreads (default 4), never on the scheduling loop, so one slow job can't delay the others - No drift, no pile-ups — interval jobs stay on a fixed grid regardless of how long each run takes;
max_instances(default 1) coalesces ticks that overlap a still-running execution instead of queueing them - Timeouts with cooperative cancellation —
timeout=Nstops waiting on a run afterNseconds and hands it a cancel signal; a callback that declarescancelcan return on its own, freeing its worker (see Timeouts & Cancellation) - Jobs never crash the loop — an exception in one job is caught, printed, and tracked (
error_count,last_error); every other job keeps running on schedule - Rust core — scheduling, timing, retries, and thread management run in Rust via PyO3; the Python API stays small and easy to read
Requirements
- Python 3.10+
- No required runtime dependencies (the extension is a self-contained native module, built for the stable ABI — one wheel works across 3.10–3.13+)
Installation
pip install rust-py-scheduler
With framework integrations:
pip install "rust-py-scheduler[fastapi]" # FastAPI + uvicorn
pip install "rust-py-scheduler[django]" # Django 4.2+
pip install "rust-py-scheduler[celery]" # Celery
For running the test suite:
pip install "rust-py-scheduler[tests]"
Quick Start
import time
from rust_py_scheduler import Scheduler
scheduler = Scheduler()
# Direct call: registers immediately and returns the job id.
job_id = scheduler.every("2s", lambda: print("tick (direct call)"))
# Decorator form: same registration, but `report` stays a normal,
# directly-callable function afterwards.
@scheduler.every("3s", max_retries=2)
def report():
print("tick (decorator, with retry budget)")
scheduler.start_background() # returns immediately, runs on its own OS thread
time.sleep(7)
for job in scheduler.list_jobs():
print(job)
scheduler.remove_job(job_id)
scheduler.shutdown()
See examples/basic_usage.py for the full, runnable version of this script.
Registering Jobs
scheduler.every("5s", my_function) # direct call
scheduler.every("5s", my_function, max_retries=3) # with a retry budget
@scheduler.every("5s") # decorator
def my_function():
...
@scheduler.every("5s", max_retries=3) # decorator, with retries
def my_function():
...
intervalaccepts an integer amount followed bys(seconds),m(minutes), orh(hours) — e.g."30s","5m","2h". Anything else (empty, missing unit, zero, negative, non-numeric) raisesValueErrorimmediately, whenevery()is called — not later, when the job would have run.- The decorator form always returns the original function unchanged (
__name__, behavior, everything) — it's safe to keep calling it directly elsewhere in your code. max_retries(default0) works identically in both forms — see Error Handling & Retries.
Cron Scheduling
For calendar-based schedules ("every weekday at 9am", "top of every hour"), use cron() with a standard 5-field Unix expression. It has the exact same dual call/decorator API as every(), including max_retries.
scheduler.cron("0 * * * *", my_function) # every hour, on the hour
scheduler.cron("*/15 * * * *", my_function) # every 15 minutes
@scheduler.cron("0 9 * * 1-5") # weekdays at 9am
def morning_report():
...
@scheduler.cron("30 2 * * *", max_retries=2) # daily at 02:30, with retries
def nightly_cleanup():
...
The five fields are minute hour day-of-month month day-of-week:
| Field | Range | Notes |
|---|---|---|
| minute | 0–59 |
|
| hour | 0–23 |
|
| day of month | 1–31 |
|
| month | 1–12 |
|
| day of week | 0–7 |
0 and 7 both mean Sunday |
Each field supports *, a single number (5), a range (9-17), a step (*/15, 9-17/2), and comma-separated lists of those (0,30, 9-11,17). When both day-of-month and day-of-week are restricted (neither is *), a time matches if either field matches — the same rule as Vixie cron.
- Timezone: expressions are evaluated in the system's local timezone.
- Resolution: cron has minute resolution; the smallest meaningful interval is one minute. For sub-minute schedules, use
every("30s", ...). - An invalid expression (wrong field count, out-of-range value, bad syntax) raises
ValueErrorimmediately at registration, just likeevery().
Framework Integrations
FastAPI
Start the scheduler with the app and stop it on shutdown, via the modern lifespan API:
from fastapi import FastAPI
from rust_py_scheduler import Scheduler
from rust_py_scheduler.fastapi import scheduler_lifespan
scheduler = Scheduler()
@scheduler.every("30s")
def heartbeat():
...
app = FastAPI(lifespan=scheduler_lifespan(scheduler))
Already have a lifespan? Compose with it: scheduler_lifespan(scheduler, your_lifespan) — your startup runs after the scheduler is up, your shutdown before it stops. See examples/fastapi_example.py.
Django
Start the scheduler from your app's AppConfig.ready():
# apps.py
from django.apps import AppConfig
from rust_py_scheduler import Scheduler
from rust_py_scheduler.django import start_in_background
scheduler = Scheduler()
@scheduler.every("5m")
def refresh_cache():
...
class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
start_in_background(scheduler)
start_in_background() is idempotent per process (calling ready() twice won't start a second thread) and registers a best-effort atexit shutdown for normal process exit.
Multi-worker note: under gunicorn/uwsgi with
workers > 1, every worker process runsready()and therefore its own scheduler — jobs run once per worker, with no cross-process coordination. For exactly-once cluster-wide scheduling, run the scheduler in a single dedicated process (e.g. a management command callingscheduler.run()). Seeexamples/django_apps.py.
Celery
There's no rust_py_scheduler.celery module — and that's deliberate. A Celery task's .delay / .apply_async is just a callable, so the existing API schedules it with nothing new to learn:
@app.task
def send_report(name):
...
scheduler.every("5m", lambda: send_report.delay("daily-metrics"))
scheduler.cron("0 8 * * 1-5", lambda: send_report.delay("weekday-digest"))
# countdown/eta/routing? use apply_async:
scheduler.every("1h", lambda: send_report.apply_async(args=["hourly"], countdown=10))
The scheduler runs in your process and only enqueues messages; the Celery worker (a separate process) does the work — so Celery keeps owning retries, routing, and concurrency. See examples/celery_example.py.
Background Execution
scheduler.run() # blocks the calling thread until shutdown() is called
scheduler.start_background() # returns immediately; scheduling continues on a new OS thread
...
scheduler.shutdown() # stops the loop and waits for the background thread to finish
run()releases the GIL while idle, so other Python threads (e.g. one callingshutdown()) keep running normally.start_background()raisesRuntimeErrorif called again while already running.shutdown()is safe to call even if the scheduler was never started, and safe to call from inside a job callback. It is one-way: once stopped, aSchedulercan't be resumed — start a new one instead. This matches typical usage (start once at application startup, shut down once at teardown).
Inspecting and Removing Jobs
for job in scheduler.list_jobs():
print(job)
# {'id': '...', 'name': 'report', 'schedule': 'every 3s', 'enabled': True,
# 'run_count': 4, 'error_count': 0, 'last_run_at': '1718721000',
# 'next_run_at': '1718721003', 'max_retries': 2, 'last_error': None}
scheduler.remove_job(job_id) # raises KeyError if job_id doesn't exist
last_run_at/next_run_at are Unix timestamps (seconds since the epoch) as strings, or None if the job hasn't run yet.
Error Handling & Retries
A job that raises an exception never stops the scheduler or any other job — the traceback is printed to stderr, and the job's own error_count is incremented.
@scheduler.every("10s", max_retries=2)
def flaky():
...
max_retries=2 means up to 3 total attempts (the initial one + 2 retries) before that scheduling tick is counted as a failure. Between attempts the worker waits retry_backoff seconds (default 0.5), doubled on each retry, capped at 30s and jittered so retries from different jobs don't line up; pass retry_backoff=0 to retry back-to-back. A run that was cancelled (timeout or shutdown) is never retried. run_count/error_count reflect ticks, not individual attempts: if any attempt within a tick succeeds, the whole tick counts as a success and last_error is cleared. Every failed attempt is still printed to stderr, even if a later attempt in the same tick succeeds.
| Situation | Exception |
|---|---|
Invalid interval passed to every(), or invalid cron expression passed to cron() |
ValueError |
start_background() called while already running |
RuntimeError |
remove_job() called with an unknown id |
KeyError |
| Exception raised inside a job callback | Caught internally — never raised to your code |
Timeouts & Cancellation
@scheduler.every("1m", timeout=30)
def sync(cancel): # declare `cancel` to opt in
for page in pages():
if cancel.cancelled: # or: cancel.raise_if_cancelled()
return
fetch(page)
@scheduler.every("10s", timeout=5)
def watch(cancel):
while not cancel.wait(1.0): # interruptible sleep: True once cancelled
poll()
timeout=N bounds how long the scheduler waits on one run. When it expires, the run is recorded as timed out (timeout_count, last_error), its max_instances slot is freed so the job can be scheduled again, and its cancel signal fires.
Python gives no safe way to interrupt arbitrary code from another thread, so the scheduler never kills a callback. Instead, a callback that declares a parameter named cancel receives a CancelToken:
| Member | Description |
|---|---|
cancel.cancelled |
True once the run was cancelled |
cancel.wait(seconds) |
Sleeps up to seconds (GIL released), returning early — and True — when cancelled |
cancel.raise_if_cancelled() |
Raises rust_py_scheduler.JobCancelled if cancelled (no traceback is printed for it) |
The token fires on timeout and on shutdown(), so cooperative callbacks also stop shutdown() from blocking on them. A callback without a cancel parameter is called exactly as before — and if it hangs forever it keeps holding its worker thread, which is why long-running jobs should take the token.
API Reference
Scheduler(max_workers=4)
Creates a new, empty scheduler. max_workers is how many callbacks may run at the same time; 0 raises ValueError.
scheduler.every(interval, callback=None, max_retries=0, retry_backoff=0.5, timeout=None, max_instances=1)
Registers an interval job. Called with callback, registers immediately and returns the job id (str); called without it (as @scheduler.every(interval)), returns a decorator that registers the function it's applied to and hands it back unchanged. Raises ValueError on an invalid interval.
max_retries/retry_backoff— see Error Handling & Retries.timeout— seconds; see Timeouts & Cancellation. Must be positive, orNone.max_instances— how many runs of this job may overlap; extra ticks are coalesced (coalesced_count).- A callback that declares a
cancelparameter is called with aCancelToken.
scheduler.cron(expression, callback=None, max_retries=0, retry_backoff=0.5, timeout=None, max_instances=1)
Registers a cron job from a 5-field Unix expression (minute hour day-of-month month day-of-week), evaluated in local time. Same dual call/decorator API, options and return values as every(). Raises ValueError on an invalid expression. See Cron Scheduling.
scheduler.list_jobs() -> list[dict]
Snapshot of every registered job.
| Key | Type | Description |
|---|---|---|
id |
str |
UUID v4 |
name |
str |
The callback's __name__ (or "job" if it has none) |
schedule |
str |
Human-readable, e.g. "every 300s" or "cron 0 9 * * 1-5" |
enabled |
bool |
Always True for now (toggling is planned) |
run_count |
int |
Successful ticks |
error_count |
int |
Failed ticks (after exhausting retries) |
last_run_at |
str | None |
Unix timestamp of the last execution |
next_run_at |
str | None |
Unix timestamp of the next scheduled execution |
max_retries |
int |
Configured retry budget |
last_error |
str | None |
Message from the most recent failed attempt; cleared on success |
retry_backoff |
float |
Base retry delay, in seconds |
timeout |
float | None |
Configured timeout, in seconds |
max_instances |
int |
Configured overlap limit |
running |
int |
Executions in flight right now |
coalesced_count |
int |
Ticks skipped because max_instances was saturated |
timeout_count |
int |
Runs that hit their timeout |
scheduler.remove_job(job_id)
Unregisters a job. Raises KeyError if job_id doesn't exist.
scheduler.run()
Blocks the calling thread, executing due jobs until shutdown() is called.
scheduler.start_background()
Runs the same loop as run() on a dedicated OS thread and returns immediately. Raises RuntimeError if already running.
scheduler.shutdown()
Stops the loop (background or not), cancels every in-flight run's CancelToken, and waits for running callbacks and the background thread to finish. Callbacks that check their token return right away; others are waited on. Safe to call multiple times, or when nothing was ever started.
Building from Source
Requires Rust and maturin.
python3 -m venv .venv
source .venv/bin/activate
pip install maturin
# Development build (installs into the current Python environment)
maturin develop
# Release wheel
maturin build --release
Running tests
# Rust unit tests
PYO3_PYTHON="$(pwd)/.venv/bin/python3" cargo test --no-default-features --lib
# Python integration tests
pip install -e ".[tests]"
pytest
Architecture
Python API (rust_py_scheduler)
├── Scheduler(...) ──► src/scheduler.rs (PyO3 #[pyclass])
│ ├── every() ──► src/job.rs (Job, Schedule model)
│ │ ──► src/interval.rs (parses "10s"/"5m"/"1h")
│ ├── cron() ──► src/cron.rs (parses "0 9 * * 1-5", next run)
│ ├── list_jobs() ──► src/registry.rs (JobRegistry snapshot)
│ ├── remove_job() ──► src/registry.rs (JobRegistry.remove)
│ ├── run() ──► src/executor.rs (run_loop, StopSignal)
│ ├── start_background() ──► run_loop() spawned on its own OS thread
│ └── shutdown() ──► StopSignal.stop() + thread join
├── rust_py_scheduler.fastapi ──► scheduler_lifespan() (pure Python)
└── rust_py_scheduler.django ──► start_in_background() (pure Python)
src/registry.rs ──► thread-safe job storage (Arc<Mutex<HashMap<...>>>); calls each
callback under the GIL, applies the retry loop, tracks counts
src/cron.rs ──► 5-field cron parser; computes the next wall-clock occurrence and
converts the gap into a monotonic Instant deadline
src/time_utils.rs ──► wall-clock timestamps for last_run_at/next_run_at (display only;
scheduling itself uses a monotonic std::time::Instant)
src/errors.rs ──► SchedulerError -> PyErr (ValueError / RuntimeError / KeyError)
The core is compiled into a native extension (.so/.pyd) by maturin and PyO3, built against Python's stable ABI (abi3-py310) so a single wheel covers Python 3.10 through 3.13+. The Python layer (python/rust_py_scheduler/__init__.py) just re-exports the compiled module.
Roadmap
Done: cron expressions, FastAPI / Django / Celery integrations, and a CI suite that runs the Rust + Python tests on every push. Still planned:
- Per-job
enabledtoggling (pause/resume without removing) - Configurable cron timezone (today: system local time)
- Publish to TestPyPI, then PyPI
License
MIT.
Metadata
Release files for rust-py-scheduler 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| rust_py_scheduler-0.3.1.tar.gz | 67.3 kB | With provenance | Details |
Built distributions (wheels)
Total release size: 5.7 MB
Release files / rust_py_scheduler-0.3.1.tar.gz
| Download URL | rust_py_scheduler-0.3.1.tar.gz |
|---|---|
| Size | 67.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2d045fafabd3ae7b7089c504317f67546efd617fd3583a066d58fd306c572882
|
|
BLAKE2b-256 checksum How to use checksums |
f3dac5f5734a6d397dc87e33b51440fe299253a6eb3bab37e969f601d8867ca8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-win_arm64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-win_arm64.whl |
|---|---|
| Size | 221.5 kB |
| Tags | CPython 3.10 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
b7c7f559f3ded48b5f2abeb2c6cb84c0a476cb4d94c68bb200da6287326ff01b
|
|
BLAKE2b-256 checksum How to use checksums |
0617bc289b1c277905d261bcc7882b8f0762f456b82412ad67d42878aac7958d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-win_amd64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 231.6 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
32bcb87e03c72c7daee03d6ec6c8ff0be81814246f083c3b21cde72c4649572f
|
|
BLAKE2b-256 checksum How to use checksums |
d2df09f3557687384e1d4bbea1d90557fdd78cfea8d526eb9499008a68eebfc8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-win32.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-win32.whl |
|---|---|
| Size | 221.2 kB |
| Tags | CPython 3.10 Windows x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
a481707523a501277e660d1adcc596488600dd40751132033c8e22dbfe88c2d5
|
|
BLAKE2b-256 checksum How to use checksums |
1ab1d6cc836dfc4b0ed42613d9c25d66f1477df3de91631985f84c9f826c4288
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 540.9 kB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
6d74f34d0752cf6680b86791c0593dc1afdbece52798b0f22a15e7a6c4c69794
|
|
BLAKE2b-256 checksum How to use checksums |
e76d5dce5626c66a7da5bcf0beb1278a0bbed41794bcdbf1d46a6fd5dc7dbfc8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_i686.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_i686.whl |
|---|---|
| Size | 578.0 kB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
6fc9b43b000d15e4d05edf1a7abf8407c1a4519b6fa067f3f13b2d2043149d88
|
|
BLAKE2b-256 checksum How to use checksums |
677af66f9fac2da38881f35a6f073670181f1d966063a2f613dcfca7e559c300
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_armv7l.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_armv7l.whl |
|---|---|
| Size | 611.3 kB |
| Tags | CPython 3.10 Linux musl 1.2+ ARMv7l abi3 |
|
SHA-256 checksum How to use checksums |
0424560fb3d671cc45996679f4b03756ad98f30984c9c839f9d41775e7820360
|
|
BLAKE2b-256 checksum How to use checksums |
1acc15909622aaa94bac9dec135ff4b17dcb3e193d8b44586bd5187f7ca8c019
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 495.5 kB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
e540af52bc87bb5bfe39d16b63e7342186cb4c17b925afdb21e77d4a9db55657
|
|
BLAKE2b-256 checksum How to use checksums |
2bcc35fda43be557c24d5cc2161acfd67e3bedcd5edb44d5646dea22b47d6f29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 329.3 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
b2b702c611089a3d565629a91419725161f2dc431a898dd7db4d44e2a0ca79b8
|
|
BLAKE2b-256 checksum How to use checksums |
2cc12092ef5e180cb6080fc2a7bbbfbf0b43c85be5080489327ae751efd7ccf0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl |
|---|---|
| Size | 372.0 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ IBM System/390x abi3 |
|
SHA-256 checksum How to use checksums |
7f4048019d5eb2f7c20b0c024b1d08e8287a8a5863956f3a0c019441fad83d1f
|
|
BLAKE2b-256 checksum How to use checksums |
93628c431fc2b04669af0608a21d75044dd1ebada0a92eddd51495de71d85683
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl |
|---|---|
| Size | 363.1 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ PowerPC 64-le abi3 |
|
SHA-256 checksum How to use checksums |
bc1c6e23e4c15bc7612cd2f8822311c1e29257b6d7a51ac0e445e5dd7b262cea
|
|
BLAKE2b-256 checksum How to use checksums |
0fef40c22e6cdd293b5839c5ecaa08a75eb53970b856c183e8563c1dd5a91753
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl |
|---|---|
| Size | 334.9 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARMv7l abi3 |
|
SHA-256 checksum How to use checksums |
8d6abfba74f99b6dda42aae4cb9eade9d9c50dc11e86cf1b38a342e06b1d388e
|
|
BLAKE2b-256 checksum How to use checksums |
ee7b3030f8352157bc211b31ca7e7a405b74adbeec83abbcdf02622fce71c3db
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 317.6 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
3325627fdb4275474db6ac090a348e5401463ca40233a4f2caa1730f1b7d830b
|
|
BLAKE2b-256 checksum How to use checksums |
0a59cca714875509425f791af8d412ad92412bad174b0f8bc7d0b2c87c2edfd4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_12_i686.manylinux2010_i686.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-manylinux_2_12_i686.manylinux2010_i686.whl |
|---|---|
| Size | 360.8 kB |
| Tags | CPython 3.10 Linux glibc 2.12+ x86-32 abi3 |
|
SHA-256 checksum How to use checksums |
17a04e9c83eab2d381e0f363fc4cf6b86bbdcc9a4de223baea47fed8d7818c66
|
|
BLAKE2b-256 checksum How to use checksums |
8154a766c101e65fa51b788ea66f30b2dd7c58dba25251de4f3006b59ba9ae41
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 301.6 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6f4b140f71332adf8ee53322e36a1f602a8b512edb956fb04a9d3db50edbf232
|
|
BLAKE2b-256 checksum How to use checksums |
48a93bc783212cc2225b7d2c79808603dc105f8d9a3b7cf82bdc0383a66f72c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / rust_py_scheduler-0.3.1-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | rust_py_scheduler-0.3.1-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 311.6 kB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
a39b39fb0eea80a0442a4e834db7262c1a1b85b40d5b07acd432c61668ba187d
|
|
BLAKE2b-256 checksum How to use checksums |
78074baeffd2ffef5d6fd52e3dc8023e0eee00fd918424c3906aed94cf2239e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for rust-py-scheduler 0.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 16 files in this release have been uploaded with provenance metadata.
Attestation for rust_py_scheduler-0.3.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.