Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

mt_asyncio

mt_asyncio is a parallel asyncio runtime for free-threaded Python: one event loop that steps asyncio tasks across many OS threads, written in Rust on top of the mio crate.

pip install --pre mt-asyncio

Releases are alpha for now, so --pre is required until the first stable one. Requires a free-threaded CPython build (python3.14t or python3.15t).

import mt_asyncio.asyncio as asyncio

async def handle(n):
    await asyncio.sleep(0.1)
    return n * 2

async def main():
    return await asyncio.gather(*[handle(i) for i in range(1000)])

asyncio.run(main())

That is the whole idea: import mt_asyncio.asyncio as asyncio and your existing coroutines run on more than one core.

Experimental — expect bugs. This is an experiment in whether asyncio can be made genuinely parallel on free-threaded Python, not production software. Releases are alpha and the APIs are subject to breaking changes. More to the point: taking away the single-threaded loop invalidates assumptions that library authors were entitled to make and never had to write down, so failures here show up as races, hangs, and — where a C extension dereferences state it assumed could not change underneath it — segfaults. Several such assumptions have been found and put back (see COMPATIBILITY.md); assume more are still out there. Do not put this in front of anything that matters.

Attribution: mt_asyncio is derived from TonIO by Giovanni Barillari and keeps its Rust runtime core; TonIO's own yield- and async-flavoured APIs are not exposed here. mt_asyncio is not affiliated with or endorsed by the TonIO project. See NOTICE.

Note: free-threaded Python (3.14t+) and Unix systems only.

At a glance

An unmodified asyncpg against a real Postgres: 20 concurrent connections each fetching 50,000 rows — 1,000,000 rows a run — with a per-row Python loop over the result. Free-threaded CPython 3.14.4, Apple M5 Max (6 performance + 12 efficiency cores), median of 3 via bench/pg_asyncpg_scale.py --cpu 40:

time rows/s vs stdlib
stdlib asyncio 1697 ms 589k 1.00×
mt_asyncio, 1 worker 1723 ms 580k 0.99×
mt_asyncio, 2 workers 1041 ms 961k 1.63×
mt_asyncio, 4 workers 642 ms 1,557k 2.64×
mt_asyncio, 8 workers 523 ms 1,911k 3.24×
mt_asyncio, 12 workers 497 ms 2,012k 3.41×

At one worker it is a wash, and that is the point: the runtime is not making the driver faster. The queries wait concurrently on any loop — what changes is that the row handling afterwards stops queueing up behind a single thread.

Nothing was written for this. The driver is the unmodified wheel from PyPI, the queries are ordinary, and the whole change to the program is two lines at the top:

import mt_asyncio.asyncio as asyncio
asyncio.compat.install()          # before importing anything that should see it

import asyncpg                    # unmodified, straight from PyPI

DSN = 'postgresql://postgres@127.0.0.1/bench'

# fixture, created once:
#   create table bench_scale_rows as
#       select g as id, (g * 7919)::bigint as v, 'row-' || g || '-payload' as t
#       from generate_series(1, 50000) g;
SQL = 'select id, v, t from bench_scale_rows'

def handle(rows):                 # ordinary Python work, once per row
    acc = 0
    for rid, v, t in rows:
        acc += rid + v + len(t)
    return acc

async def query(conn):
    return handle(await conn.fetch(SQL))     # 50,000 rows, then work on each

async def main():
    conns = [await asyncpg.connect(DSN) for _ in range(20)]
    # 20 queries in flight at once. The waiting overlaps on any loop; what
    # differs is the handle() loops afterwards — stdlib asyncio has one thread
    # to run all 20 on, so they queue behind each other. Here they do not.
    return await asyncio.gather(*[query(c) for c in conns])

asyncio.run(main(), threads=12)   # 20 queries, 1,000,000 rows, 12 workers

compat.install() points the asyncio namespace at mt_asyncio's implementations, so a library that does import asyncio internally gets this loop rather than CPython's. asyncpg then opens its connections through create_connection and talks to the network through transports exactly as it always has — it never learns that its callbacks and its tasks are now running on twelve threads.

The synthetic suite covers the shapes this one workload cannot: CPU work between awaits reaches 7.34× at 16 threads, while timers and cancellation are genuinely slower than stdlib. See Performance.

Why

CPython's asyncio loop is single-threaded by design: one thread steps every task, so an async workload cannot use more than one core no matter how many tasks it has. On free-threaded Python that limit is no longer necessary.

mt_asyncio keeps asyncio's API and semantics but replaces the scheduler: tasks are handed to a Rust work-stealing runtime and stepped in parallel on its worker threads. I/O readiness comes from an edge-triggered mio reactor, and run_in_executor from a native blocking thread-pool.

The trade-off is stated up front, because it is the one thing that changes: callbacks are no longer serialized. Stdlib asyncio gives you implicit mutual exclusion (everything runs on the loop thread); mt_asyncio does not. Shared state touched from tasks or callbacks needs a lock — the ones in mt_asyncio.asyncio are genuinely cross-thread. This is the price of using multiple cores.

Usage

Everything lives in mt_asyncio.asyncio, which mirrors the asyncio namespace:

import mt_asyncio.asyncio as asyncio

async def worker(queue):
    while True:
        item = await queue.get()
        if item is None:
            return
        await process(item)

async def main():
    queue = asyncio.Queue(maxsize=100)

    async with asyncio.TaskGroup() as tg:
        for _ in range(8):
            tg.create_task(worker(queue))

        async for item in source():
            await queue.put(item)
        for _ in range(8):
            await queue.put(None)

asyncio.run(main())

Supported: run, create_task, gather, wait, wait_for, shield, as_completed, sleep, to_thread, TaskGroup, timeout/timeout_at, Future, Task (with cancel/cancelling/uncancel), Lock, Event, Condition, Semaphore, BoundedSemaphore, Queue/LifoQueue/PriorityQueue, run_coroutine_threadsafe, wrap_future, and the loop's call_soon, call_later, call_at, run_in_executor, getaddrinfo, and sock_* methods.

Networking: add_reader/add_writer, create_connection, create_server, start_tls, open_connection/start_server and TLS.

Not implemented: datagram endpoints, subprocesses, Barrier, and loop policies. See mt_asyncio/asyncio/COMPATIBILITY.md for the full surface, the behavioural differences, and the workarounds.

Third-party libraries

There are two ways to reach a database here, and which one fits depends on the shape of your concurrency rather than on what is supported.

Async driver. psycopg's async API works under compat.install() — it waits on add_reader/add_writer, which are implemented. Its wait_async loop is covered in tests/test_netlibs.py against both backends, and concurrent queries across many connections are verified against a real server.

import mt_asyncio.asyncio as asyncio

asyncio.compat.install()   # before importing psycopg

import psycopg

async def fetch_user(conn, user_id):
    async with conn.cursor() as cur:
        await cur.execute('select name from users where id = %s', (user_id,))
        return await cur.fetchone()

async def main():
    async with await psycopg.AsyncConnection.connect('postgresql:///app') as conn:
        return await fetch_user(conn, 1)

asyncio.run(main())

No thread per query, so concurrency is bounded only by your connection pool. The cost is a reactor hop per round trip.

asyncpg works the same way and takes a different route through the loop — create_connection and transports rather than add_reader — which is why the benchmark above uses it. Two caveats. Its C protocol assumes the serialization a single-threaded loop provides; the guarantees it needs are restored per connection (COMPATIBILITY.md §1), but getting them wrong is a segfault rather than an exception, so treat asyncpg here as less proven than psycopg. And it defaults to ssl='prefer', so every connection costs an extra negotiation round trip against a server without TLS.

Sync driver behind to_thread. One pool thread per in-flight query, capped by blocking_threadpool_size (128 by default), and no event-loop work in the query path at all. This is also the only option for clients with no async API — requests, boto3, and plenty of vendor SDKs.

import mt_asyncio.asyncio as asyncio
from psycopg_pool import ConnectionPool

pool = ConnectionPool('postgresql:///app', min_size=16, max_size=16)

async def fetch_user(user_id):
    def query():
        with pool.connection() as conn:
            return conn.execute('select name from users where id = %s', (user_id,)).fetchone()

    return await asyncio.to_thread(query)

async def main():
    return await asyncio.gather(*[fetch_user(i) for i in range(1000)])

asyncio.run(main())

to_thread hands query to the runtime's native blocking pool. Note this is a better to_thread than the stdlib one rather than a fallback from it: on a free-threaded build those threads run Python concurrently, so the queries are genuinely in flight at once instead of taking turns under the GIL — and the coroutines awaiting them are stepped in parallel too. Size the connection pool, or bound it with a Semaphore, so you do not queue more work than the database can take.

The db_query benchmark measures the to_thread pattern; point MT_ASYNCIO_BENCH_DSN at a real server to run it against Postgres.

Blocking calls

Blocking directly in a coroutine is survivable here, which it is not under stdlib: it occupies one worker, and the others keep stepping tasks.

async def handler():
    time.sleep(0.05)      # occupies a worker for 50ms, not the whole loop
    return 'done'

There are two ways to make that safe, and on a free-threaded build both are legitimate — the choice is about failure modes, not speed.

Offload it. await asyncio.to_thread(...) moves the call to the blocking pool and keeps every worker free.

Or just have more workers. Blocked threads are off-CPU, so raising threads costs little. Measured with 64 concurrent 10ms blocking calls:

8 workers 128 workers
blocking inline 102.6 ms 16.7 ms
via to_thread 14.9 ms 18.5 ms
CPU-bound workload 724.8 ms 362.4 ms

At 128 workers, inline blocking matches to_thread, and CPU work did not suffer from oversubscription on an 18-core machine.

What the split still buys is isolation and elasticity, not throughput:

  • Exhaust the blocking pool and offloads simply queue — the scheduler keeps running. Exhaust the workers and the runtime stalls, because workers are also what run task steps, timers and I/O dispatch. Raising threads moves that cliff without removing it.
  • Pool threads are created on demand and retire after blocking_threadpool_idle_ttl; workers are created at startup and live for the life of the process.

The cost of the split is that the two pools cannot help each other: a blocking pool thread never steps a coroutine, and a worker never picks up offloaded work.

The cliff is worth seeing, because it is silent. With 4 workers, a 50ms blocking call, and an unrelated task watching how long it is kept off the CPU:

concurrent blockers throughput worst stall elsewhere
3 (threads - 1) unaffected 1 ms
4 (threads) still unaffected 51 ms

At exactly the worker count the wall clock looks fine while everything else freezes for the full duration. The default threads is cpu_count() + 4 for this reason — headroom so ordinary blocking does not reach the edge. Use to_thread when you want that guarantee rather than a margin, and raise threads when your workload is mostly blocking and you would rather not partition your threads at all.

Sizing the runtime

run() takes a threads argument, and mt_asyncio.runtime() configures the process-wide runtime up front:

import mt_asyncio
import mt_asyncio.asyncio as asyncio

# 8 worker threads, a smaller blocking pool
mt_asyncio.runtime(threads=8, blocking_threadpool_size=32, context=True)

asyncio.run(main())
option description default
threads runtime worker threads (scheduler and execution) # of CPU cores + 4
context propagate contextvars into coroutines (required by the loop) False
blocking_threadpool_size maximum blocking threads 128
blocking_threadpool_idle_ttl idle timeout for blocking threads (seconds) 30
signals signals the runtime listens for

The drop-in boundary

import mt_asyncio.asyncio as asyncio parallelizes code that uses those names. A third-party library does import asyncio internally and gets CPython's.

The C Future/Task are not the obstacle — on 3.14t the current-task slot lives in thread state and Future is internally locked. The problem is the pure-Python layer above them, which has no synchronisation at all: gather._done_callback does an unsynchronised nfinished += 1, so one lost increment means the outer future never resolves, and Lock.acquire check-then-sets _locked over a bare deque. Those failures are hangs, not wrong answers.

Compat mode points those names at mt_asyncio's own locked implementations:

import mt_asyncio.asyncio as asyncio

asyncio.compat.install()   # before importing libraries that should see it

import some_library
asyncio.run(some_library.main())

gather, wait_for, TaskGroup, Lock, Event, Queue, Future, create_task and the rest are redirected, in asyncio and in the submodules that re-export them. Install before importing anything that should see it — shadowing only rebinds module attributes, so a module that already did from asyncio import Lock keeps the original. Patching is process-global; compat.uninstall() reverses it.

Transports are implemented — add_reader/add_writer, create_connection, create_server, start_tls and streams all work, over TLS as well as plain TCP. psycopg's async API, aiohttp and websockets all drive them correctly.

The remaining boundary is one level up, and no lock can close it: a library that shares mutable state between tasks can race, because tasks step in parallel. Both aiohttp and websockets keep a registry of live connections and iterate it during server shutdown while another task mutates it, so their shutdown paths are unreliable here even though serving traffic is not. anyio (and therefore httpx) livelocks against our cooperative cancellation and is unsupported. See COMPATIBILITY.md for the measurements.

Compatibility testing

tests/test_parity.py is a differential suite: every scenario is written once and run against both stdlib asyncio and mt_asyncio.asyncio, asserting the same observable outcome. A divergence that is not listed in COMPATIBILITY.md is treated as a bug.

make test

Performance

Speedup versus stdlib asyncio on the same coroutines (free-threaded CPython 3.14.4, Apple M5 Max — 6 performance + 12 efficiency cores; median of 3 runs via bench/asyncio_bench.py, or make bench):

workload 1 thread best
CPU work between awaits 1.21× 7.34× @16
each unit under wait_for 0.97× 6.59× @16
fan-out with TaskGroup 1.08× 5.72× @16
server handler (I/O + per-request work) 1.00× 5.28× @16
producer → queue → consumers 1.02× 3.88× @8
one shared Lock 0.95× 3.01× @4
pure scheduling, no per-task work 1.41× 1.60× @16
many real sleep() timers 0.51× 0.55× @4
create + cancel + unwind 0.62× 0.62× @1

Read that honestly. mt_asyncio is at rough parity per-thread and wins by parallelizing, so the more real work a task does between awaits, the better it does. Two things are genuinely slower: timers — each sleep() builds a Future, a TimerHandle and a helper coroutine where the runtime underneath needs only one native waiter — and cancellation, which is pure coordination and gets worse with more threads. Past 6 threads this machine is scheduling onto efficiency cores, so the 16-thread column is not 16 equal cores.

Real drivers

Synthetic workloads choose their own CPU/IO mix, so two scripts use a real Postgres instead. bench/pg_asyncpg_scale.py is the asyncpg run above; it has no upstream TonIO column because tonio-monkey ships no asyncpg patch — asyncpg never calls add_reader, it goes through transports. bench/pg_tax.py covers psycopg, where there is an upstream comparison to make; see bench/README.md.

Benchmarks must be run against a release build (make build-release); the scripts refuse to run on a debug one, which is several times slower.

License

mt_asyncio is released under the BSD-3-Clause License, the same license as TonIO, whose copyright notice it retains. Ported CPython code is additionally covered by the PSF License Agreement. See LICENSE and NOTICE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mt_asyncio-0.1.1a1.tar.gz (114.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_x86_64.whl (608.0 kB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ x86-64

mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_armv7l.whl (674.3 kB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARMv7l

mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_aarch64.whl (559.9 kB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARM64

mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (395.2 kB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (397.4 kB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ ARMv7l

mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (382.5 kB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ ARM64

mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl (422.6 kB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.12+ i686

mt_asyncio-0.1.1a1-cp315-cp315t-macosx_11_0_arm64.whl (349.1 kB view details)

Uploaded CPython 3.15tmacOS 11.0+ ARM64

mt_asyncio-0.1.1a1-cp315-cp315t-macosx_10_12_x86_64.whl (365.9 kB view details)

Uploaded CPython 3.15tmacOS 10.12+ x86-64

mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_x86_64.whl (608.2 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ x86-64

mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_armv7l.whl (674.1 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARMv7l

mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_aarch64.whl (560.0 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARM64

mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (395.2 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (397.3 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7l

mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (382.7 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl (422.4 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.12+ i686

mt_asyncio-0.1.1a1-cp314-cp314t-macosx_11_0_arm64.whl (349.3 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

mt_asyncio-0.1.1a1-cp314-cp314t-macosx_10_12_x86_64.whl (366.0 kB view details)

Uploaded CPython 3.14tmacOS 10.12+ x86-64

File details

Details for the file mt_asyncio-0.1.1a1.tar.gz.

File metadata

  • Download URL: mt_asyncio-0.1.1a1.tar.gz
  • Upload date:
  • Size: 114.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for mt_asyncio-0.1.1a1.tar.gz
Algorithm Hash digest
SHA256 9afe6108d234679884aa2dbd6f687ff4797c283739181586ebd13fc351b28569
MD5 9d5f20f391442030ceca1f207ecd38d5
BLAKE2b-256 bb48f2c80cfe59f1c8981fa1092cf754fc0cfa3bdb41de6ffb074d1f6b9322d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1.tar.gz:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ae145a9fa03b6cee457e0a4ad428fe71d8d3c0deaa2dff76ffa9ed14725adb6a
MD5 5469dcdf34edad29d5b4e91b54650ac3
BLAKE2b-256 1928a92421d5a0327917e35cd0d21b687ea41a6d0dc637dfbe2c8a32ca212e64

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_x86_64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 4442f550bf351ea8769b60e82393bce90329bd17ade3e5531ac699a52373400b
MD5 d299b521583558f1657141c168e2e649
BLAKE2b-256 31e830b8bd6f93f93a59bc74b834a1347d9435404b6af4c8c3ea1feff76093e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_armv7l.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 dc970c84b9479de77779ec4e9eaf1456d4af2cc130670ca40af90d97151b42c0
MD5 d434e7e88c778f82ece5a13bf3a13992
BLAKE2b-256 2cab1e972cad2525722f1558eea2820013b1ce33617a79db942b572951db5212

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-musllinux_1_1_aarch64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4a462894b08a4c96cfe558cb05d0cf725a8303304099f2c711ba4196a3d89922
MD5 e2a5d435aba4ad2ed456c0542c29c8f5
BLAKE2b-256 47d77f92e7b7f67ebd353f0f8e94668de0e8e6981bd9cfce80248bfec9eadcaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 3d6f1a5890d61a3b01a98351c010dbdf67a44e57b0ed9d9fd6ad62e81e8555cf
MD5 ae48874b097fc0e657522e4349bc76db
BLAKE2b-256 c1000a270af271a6c5a8417fa1d5f621891490234766d163302c5aed69a74f77

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cf560c959d36bd5c330de028c11f21e89bf145bdc0625316fdbf9c54504c92ab
MD5 1873c0f1995d79e689d483cb7c2cde76
BLAKE2b-256 d64ef1b13d5867d3137830942f59d0fbac0d41975cb94844af89740952ee3d33

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5f2e692c24c473f516a53c8cee2a7719c6da55e6db4fbfbc174da2f2d14191f3
MD5 d2f0095db0d7c3a091ec947faa2e47e0
BLAKE2b-256 d59e8363a69ef52643e03642fc3f61e4b0e5dfaf0c524845eeeeb43923679404

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 01a41b68a442b5b5cf19faeb0ffc81c4f487964b11c416fd44ac159bf6ea5971
MD5 3f29dd52360cc2a4abb1c25fa4ab8d97
BLAKE2b-256 533683ed050e42659738cf067399a8bb0f71e1b824abe7b510287d187750a3aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-macosx_11_0_arm64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp315-cp315t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp315-cp315t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a4b211dd2ed82c6c8290607295833ff2b30874a77235601094cf242d9d64435e
MD5 89be5fd96fcae15ed30bc235c416370c
BLAKE2b-256 e8927ef3d40af4b9e373c3e97948f7cdd6d36abc340514858db4cbc61d3ee603

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp315-cp315t-macosx_10_12_x86_64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 fd8ce78fd83089f61319b0e2335792cf42823a10f4f25734c3bf6f4493c674ca
MD5 d6b81e4759b49dcfe96188b1263e894d
BLAKE2b-256 b667a7c81f673bc21e58b9777a371d909d4cf113f2c0025e9618af5f34a4fab7

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_x86_64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 66e9c2276d5171407f1650d34d1a0e2df0cdded5b734082bc91fd8ec3f558143
MD5 be38935036bfaed74a2632d999595c24
BLAKE2b-256 d9a6bd20424f194dcd3a8a25738f08d8458b9ff224ac8b27f53f9acd266bd5fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_armv7l.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 8d7afebd04d2dca8468bf96606cd0c7d33ddf2582a82411540b114b4574a181e
MD5 63dab5cb9815d685b812d70cb1182861
BLAKE2b-256 03b2cdbd15d1cfbf199f45b9829aaeee9aa03e73798530462767f8b73f5bc373

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-musllinux_1_1_aarch64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2baf2fe81b2120c27ee2eebb712655dcb086a05606b3c2bfa8d50af495b3eb54
MD5 931e1da5da648488c965c243d146fd36
BLAKE2b-256 4e3488b706a0a13dc808ba8835599fa9bc545ea73b6e792392e44c92063eefa3

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 8bcefd40c76ddaa26a9f18537668e5eb7adda3ae4e56f7d527a81a052600f636
MD5 80a2f0d43d06d22bd3bce121db2161cf
BLAKE2b-256 7b808cf8adf36b9edad4f3d619c784e41aae695f16b3b84eb2e97f5f3fc684a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0e3cc6b8b531ae7d7e297cb4da37ba576e573f4c2b00072ff1ea02d5754417bc
MD5 37c7e4cfc3aa5c5639c95f18a5168c45
BLAKE2b-256 8d714d631d99a239ffcb22597485297a1e3b9747ccc212dd20673a9ac7e4db78

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 a706e7ae9a198eb56878586bea9043550499376783d2788a7d258672b616227d
MD5 a3b508e487b67cffbdd5ef644f8e1df5
BLAKE2b-256 eb0fb41151b4a557f2de4b36bba44a4becf21c9a28a5f8b290405f6969166de1

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5f87c003ed3d055d398b410dff2bbcdba87df4217fa8550144f4df1da6bd668b
MD5 6cb5e74e279fa2b40e547db5d1b038e8
BLAKE2b-256 c99cb040717c0d12ff220f385932fc0aaee67f47206c95529e4377297e3a334d

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mt_asyncio-0.1.1a1-cp314-cp314t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mt_asyncio-0.1.1a1-cp314-cp314t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d5935453241fdeaaa4c341a2a3f7c0e3048a44e267c2faf197f563bfcf51481f
MD5 6be3af701fd7c087e4090c38e62b727c
BLAKE2b-256 fc5ebaeafe3e79d109876a64265d7b61e66287fcd3165f44d4fba57fc094dae5

See more details on using hashes here.

Provenance

The following attestation bundles were made for mt_asyncio-0.1.1a1-cp314-cp314t-macosx_10_12_x86_64.whl:

Publisher: release.yml on johng/mt_asyncio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.1a1 This release

19 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page