Skip to main content

A multi-threaded async runtime

Project description

TonIO

TonIO is a multi-threaded async runtime for free-threaded Python, built in Rust on top of the mio crate, and inspired by tinyio, trio and tokio.

Warning: TonIO is currently a work in progress and in alpha state. The APIs are subtle to breaking changes.

Note: TonIO is available on free-threaded Python and Unix systems only.

TonIO supports both using yield and the more canonical async/await notations, with the latter being available as part of the tonio.colored module. Following code snippets show both the usages.

Warning: despite the fact TonIO supports async and await notations, it's not compatible with any asyncio object like futures and tasks.

In a nutshell

yield syntax

import tonio

def wait_and_add(x: int) -> int:
    yield tonio.sleep(1)
    return x + 1

def foo():
    four, five = yield tonio.spawn(
        wait_and_add(3), 
        wait_and_add(4)
    )
    return four, five

out = tonio.run(foo())
assert out == (4, 5)

await syntax

import tonio.colored as tonio

async def wait_and_add(x: int) -> int:
    await tonio.sleep(1)
    return x + 1

async def foo():
    four, five = await tonio.spawn(
        wait_and_add(3), 
        wait_and_add(4)
    )
    return four, five

out = tonio.run(foo())
assert out == (4, 5)

Usage

Entrypoint

Every TonIO program consist of an entrypoint, which should be passed to the run method:

yield syntax

import tonio

def main():
    yield
    print("Hello world")

tonio.run(main())

await syntax

import tonio.colored as tonio

async def main():
    await tonio.yield_now()
    print("Hellow world")

tonio.run(main())

TonIO also provides a main decorator, thus we can rewrite the previous example as:

yield syntax

import tonio

@tonio.main
def main():
    yield
    print("Hello world")

main()

await syntax

import tonio.colored as tonio

@tonio.main
async def main():
    await tonio.yield_now()
    print("Hello world")

main()

Note: as you can see the colored module provides the additional yield_now coroutine, a quick way to define a suspension point, given you cannot just yield as in the non-colored notation.

Note: both run and main can only be called once per program. To run the runtime multiple times in the same program, follow the section below.

Manually managing the runtime

TonIO also provides the runtime function, to manually manage the runtime lifecycle:

import tonio

def _run1():
    ...

async def _run2():
    ...

def main():
    runtime = tonio.runtime()
    runtime.run_until_complete(_run1())
    runtime.run_until_complete(_run2())

Runtime options

The run, main and runtime methods accept options, specifically:

option name description default
context enable contextvars usage in coroutines False
signals list of signals to listen to
threads Number of runtime threads # of CPU cores
blocking_threadpool_size Maximum number of blocking threads 128
blocking_threadpool_idle_ttl Idle timeout for blocking threads (in seconds) 30

Events

The core object in TonIO is Event. It's basically a wrapper around an atomic boolean flag, initialised with False. Event provides the following methods:

  • is_set(): return the value of the flag
  • set(): set the flag to True
  • clear(): set the flag to False
  • wait(timeout=None): returns a coroutine you can yield on that unblocks when the flag is set to True or the timeout expires. Timeout is in seconds.

yield syntax

import tonio

@tonio.main
def main():
    event = tonio.Event()

    def setter():
        yield tonio.sleep(1)
        event.set()

    tonio.spawn(setter())
    yield event.wait()

await syntax

import tonio.colored as tonio

@tonio.main
async def main():
    event = tonio.Event()

    async def setter():
        await tonio.sleep(1)
        event.set()

    tonio.spawn(setter())
    await event.wait()

Spawning tasks

TonIO provides the spawn method to schedule new coroutines onto the runtime:

yield syntax

import tonio

def doubv(v):
    yield
    return v * 2

@tonio.main
def main():
    parallel = tonio.spawn(doubv(2), doubv(3))
    v3 = yield doubv(4)
    v1, v2 = yield parallel
    print([v1, v2, v3])

await syntax

import tonio.colored as tonio

async def doubv(v):
    await tonio.yield_now()
    return v * 2

@tonio.main
async def main():
    parallel = tonio.spawn(doubv(2), doubv(3))
    v3 = await doubv(4)
    v1, v2 = await parallel
    print([v1, v2, v3])

Coroutines passed to spawn get schedule onto the runtime immediately. Using yield or await on the return value of spawn just waits for the coroutines to complete and retreive the results.

Blocking tasks

TonIO provides the spawn_blocking method to schedule blocking operations onto the runtime:

yield syntax

import tonio

def read_file(path):
    with open(file, "r") as f:
        return f.read()

@tonio.main
def main():
    file_data = yield tonio.spawn_blocking(
        read_file, 
        "sometext.txt"
    )

await syntax

import tonio.colored as tonio

def read_file(path):
    with open(file, "r") as f:
        return f.read()

@tonio.main
async def main():
    file_data = await tonio.spawn_blocking(
        read_file, 
        "sometext.txt"
    )

Map utilities

TonIO provides the map and map_blocking utilities to spawn the same operation with an iterable of parameters:

yield syntax

import tonio

accum = []

def task(no):
    yield tonio.sleep(0.5)
    accum.append(no * 2)

@tonio.main
def main():
    yield tonio.map(task, range(4))

await syntax

import tonio.colored as tonio

accum = []

async def task(no):
    await tonio.sleep(0.5)
    accum.append(no * 2)

@tonio.main
async def main():
    await tonio.map(task, range(4))

Scopes and cancellations

TonIO provides a scope context, that lets you cancel work spawned within it:

yield syntax

import tonio

def slow_push(target, sleep):
    yield tonio.sleep(sleep)
    target.append(True)

@tonio.main
def main():
    values = []
    with tonio.scope() as scope:
        scope.spawn(_slow_push(values, 0.1))
        scope.spawn(_slow_push(values, 2))
        yield tonio.sleep(0.2)
        scope.cancel()
    yield scope()
    assert len(values) == 1

await syntax

import tonio.colored as tonio

async def slow_push(target, sleep):
    await tonio.sleep(sleep)
    target.append(True)

@tonio.main
async def main():
    values = []
    async with tonio.scope() as scope:
        scope.spawn(_slow_push(values, 0.1))
        scope.spawn(_slow_push(values, 2))
        await tonio.sleep(0.2)
        scope.cancel()
    assert len(values) == 1

When you yield on the scope, it will wait for all the spawned coroutines to end. If the scope was canceled, then all the pending coroutines will be canceled.

Note: as you can see, the colored version of scope doesn't require to be awaited, as it will yield when exiting the context.

Time-related functions

  • tonio.time.time(): a function returning the runtime's clock (in seconds, microsecond resolution)
  • tonio.time.sleep(delay): a coroutine you can yield on to sleep (delay is in seconds)
  • tonio.time.timeout(coro, timeout): a coroutine you can yield on returning a tuple (output, success). If the coroutine succeeds in the given time then the pair (output, True) is returned. Otherwise this will return (None, False).

Note: time.sleep is also exported to the main tonio module.

Note: all of the above functions are also present in tonio.colored.time module.

Scheduling work

TonIO provides the time.interval function to create interval objects you can yield on a scheduled basis:

yield syntax

import tonio
from tonio import time

def some_task():
    ...

def scheduler():
    interval = time.interval(1)
    while True:
        yield interval.tick()
        tonio.spawn(some_task())

@tonio.main
def main():
    tonio.spawn(scheduler())
    # do some other work

await syntax

import tonio.colored as tonio
from tonio.colored import time

async def some_task():
    ...

async def scheduler():
    interval = time.interval(1)
    while True:
        await interval.tick()
        tonio.spawn(some_task())

@tonio.main
async def main():
    tonio.spawn(scheduler())
    # do some other work

The interval method first argument is the interval in seconds resolution, and the method also accepts an optional at argument, to delay the first execution at a specific time (from the runtime's clock perspective):

from tonio import time

# tick every 500ms, with the first tick happening in 5 seconds from now
interval = time.interval(0.5, time.time() + 5)

Synchronization primitives

Synchronization primitives are exposed in the tonio.sync module.

Lock

Implements a classic mutex, or a non-reentrant, single-owner lock for coroutines:

yield syntax

import tonio
from tonio import sync

@tonio.main
def main():
    # counter can't go above 1
    counter = 0

    def _count(lock):
        nonlocal counter
        with (yield lock()):
            counter += 1
            yield
            counter -= 1
    
    lock = sync.Lock()
    yield tonio.spawn(*[
        _count(lock)
        for _ in range(10)
    ])

await syntax

import tonio.colored as tonio
from tonio.colored import sync

@tonio.main
async def main():
    # counter can't go above 1
    counter = 0

    async def _count(lock):
        nonlocal counter
        async with lock():
            counter += 1
            await tonio.yield_now()
            counter -= 1
    
    lock = sync.Lock()
    await tonio.spawn(*[
        _count(lock)
        for _ in range(10)
    ])

The Lock object also implements an or_raise method, that will immediately fail when the lock cannot be acquired:

from tonio.exceptions import WouldBlock

try:
    with lock.or_raise():
        ...
except WouldBlock:
    ...

Semaphore

A semaphore for coroutines:

yield syntax

import tonio
from tonio import sync

@tonio.main
def main():
    # counter can't go above 2
    counter = 0

    def _count(semaphore):
        nonlocal counter
        with (yield semaphore()):
            counter += 1
            yield
            counter -= 1
    
    semaphore = sync.Semaphore(2)
    yield tonio.spawn(*[
        _count(semaphore)
        for _ in range(10)
    ])

await syntax

import tonio.colored as tonio
from tonio.colored import sync

@tonio.main
async def main():
    # counter can't go above 2
    counter = 0

    async def _count(semaphore):
        nonlocal counter
        async with semaphore():
            counter += 1
            await tonio.yield_now()
            counter -= 1
    
    semaphore = sync.Semaphore(2)
    await tonio.spawn(*[
        _count(semaphore)
        for _ in range(10)
    ])

As for locks, the Semaphore object also implements an or_raise method, that will immediately fail when the lock cannot be acquired:

from tonio.exceptions import WouldBlock

try:
    with semaphore.or_raise():
        ...
except WouldBlock:
    ...

The Semaphore object also implements a tokens method, that returns the number of available tokens.

Barrier

A barrier for coroutines:

yield syntax

import tonio
from tonio import sync

@tonio.main
def main():
    barrier = sync.Barrier(3)
    count = 0

    def _start_at_3():
        nonlocal count
        count += 1
        i = yield barrier.wait()
        assert count == 3
        return i

    yield tonio.spawn(*[
        _start_at_3()
        for _ in range(3)
    ])

await syntax

import tonio.colored as tonio
from tonio.colored import sync

@tonio.main
async def main():
    barrier = sync.Barrier(3)
    count = 0

    async def _start_at_3():
        nonlocal count
        count += 1
        i = await barrier.wait()
        assert count == 3
        return i

    await tonio.spawn(*[
        _start_at_3()
        for _ in range(3)
    ])

The Barrier object also implements a value method, which returns the current value of the barrier.

Channels

Multi-producer multi-consumer channels for inter-coroutine communication.

The tonio.sync.channel module provides both a channel and an unbounded constructors.
The main difference between bounded and unbounded channels, as the names suggest, is that while the first will suspend sending messages once the specified length is reached, and it will resume accepting messages once the existing buffer is consumed, the latter will always accept new messages. That's also why, the sender part of a bounded channel is async, while in the unbounded is not.

Bounded channel

yield syntax

import tonio
from tonio import sync
from tonio.sync import channel

def producer(sender, barrier, offset):
    for i in range(20):
        message = offset + 1
        yield sender.send(message)
    yield barrier.wait()

def consumer(receiver):
    while True:
        try:
            message = yield receiver.receive()
            print(message)
        except Exception:
            break

@tonio.main
def main():
    def close(sender, barrier):
        yield barrier.wait()
        sender.close()

    sender, receiver = channel.channel(2)
    barrier = sync.Barrier(3)
    yield tonio.spawn(*[
        producer(sender, barrier, 100),
        producer(sender, barrier, 200),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        close(sender, barrier),
    ])

await syntax

import tonio.colored as tonio
from tonio.colored import sync
from tonio.colored.sync import channel

async def producer(sender, barrier, offset):
    for i in range(20):
        message = offset + 1
        await sender.send(message)
    await barrier.wait()

async def consumer(receiver):
    while True:
        try:
            message = await receiver.receive()
            print(message)
        except Exception:
            break

@tonio.main
async def main():
    async def close(sender, barrier):
        await barrier.wait()
        sender.close()

    sender, receiver = channel.channel(2)
    barrier = sync.Barrier(3)
    await tonio.spawn(*[
        producer(sender, barrier, 100),
        producer(sender, barrier, 200),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        close(sender, barrier),
    ])
Unbounded channel

yield syntax

import tonio
from tonio import sync
from tonio.sync import channel

def producer(sender, barrier, offset):
    for i in range(20):
        message = offset + 1
        sender.send(message)
    yield barrier.wait()

def consumer(receiver):
    while True:
        try:
            message = yield receiver.receive()
            print(message)
        except Exception:
            break

@tonio.main
def main():
    def close(sender, barrier):
        yield barrier.wait()
        sender.close()

    sender, receiver = channel.unbounded()
    barrier = sync.Barrier(3)
    yield tonio.spawn(*[
        producer(sender, barrier, 100),
        producer(sender, barrier, 200),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        close(sender, barrier),
    ])

await syntax

import tonio.colored as tonio
from tonio.colored import sync
from tonio.colored.sync import channel

async def producer(sender, barrier, offset):
    for i in range(20):
        message = offset + 1
        sender.send(message)
    await barrier.wait()

async def consumer(receiver):
    while True:
        try:
            message = await receiver.receive()
            print(message)
        except Exception:
            break

@tonio.main
async def main():
    async def close(sender, barrier):
        await barrier.wait()
        sender.close()

    sender, receiver = channel.unbounded()
    barrier = sync.Barrier(3)
    await tonio.spawn(*[
        producer(sender, barrier, 100),
        producer(sender, barrier, 200),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        consumer(receiver),
        close(sender, barrier),
    ])

Network module

Network primitives are exposed under the tonio.net module.

Low-level sockets

The tonio.net.socket module provides TonIO's basic low-level networking API.
Generally, the API exposed by this module mirrors the standard library socket module.

TonIO socket objects are overall very similar to the standard library socket objects, with the main difference being that blocking methods become coroutines.

yield syntax

import tonio
from tonio.net import socket

def server():
    sock = socket.socket()
    with sock:
        yield sock.bind(('127.0.0.1', 8000))
        sock.listen()

        while True:
            client, _ = yield sock.accept()
            tonio.spawn(server_handle(client))

def server_handle(connection):
    with connection:
        # receive some data
        data = yield connection.recv(4096)

def client():
    sock = socket.socket()
    with sock:
        yield sock.connect(('127.0.0.1', 8000))
        yield sock.send("message")

await syntax

import tonio.colored as tonio
from tonio.colored.net import socket

async def server():
    sock = socket.socket()
    with sock:
        await sock.bind(('127.0.0.1', 8000))
        sock.listen()

        while True:
            client, _ = await sock.accept()
            tonio.spawn(server_handle(client))

async def server_handle(connection):
    with connection:
        # receive some data
        data = await connection.recv(4096)

async def client():
    sock = socket.socket()
    with sock:
        await sock.connect(('127.0.0.1', 8000))
        await sock.send("message")

Signals

TonIO provides a context manager to catch signals.

The usage of such context manager requires to first configure the runtime to listen for such signals:

yield syntax

import signal
import tonio
from tonio.time import interval

def sig_handle():
    with tonio.signal_receiver(
        signal.SIGHUP, 
        signal.SIGUSR1
    ) as sigs:
        for ev in sigs:
            sig = yield ev
            if sig == signal.SIGHUP:
                ...

@tonio.main(
    signals=[signal.SIGHUP, signal.SIGUSR1]
)
def main():
    tonio.spawn(sig_handle())
    ticker = interval(1)
    while True:
        yield ticker.tick()

await syntax

import signal
import tonio.colored as tonio
from tonio.colored.time import interval

async def sig_handle():
    with tonio.signal_receiver(
        signal.SIGHUP, 
        signal.SIGUSR1
    ) as sigs:
        async for sig in sigs:
            if sig == signal.SIGHUP:
                ...

@tonio.main(
    signals=[signal.SIGHUP, signal.SIGUSR1]
)
async def main():
    tonio.spawn(sig_handle())
    ticker = interval(1)
    while True:
        await ticker.tick()

License

TonIO is released under the BSD License.

Project details


Download files

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

Source Distribution

tonio-0.2.1.tar.gz (42.6 kB view details)

Uploaded Source

Built Distributions

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

tonio-0.2.1-cp314-cp314t-musllinux_1_1_x86_64.whl (591.7 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ x86-64

tonio-0.2.1-cp314-cp314t-musllinux_1_1_armv7l.whl (651.3 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARMv7l

tonio-0.2.1-cp314-cp314t-musllinux_1_1_aarch64.whl (538.0 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARM64

tonio-0.2.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (376.6 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

tonio-0.2.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (374.7 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7l

tonio-0.2.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (360.7 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

tonio-0.2.1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl (407.0 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.12+ i686

tonio-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl (324.9 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

tonio-0.2.1-cp314-cp314t-macosx_10_12_x86_64.whl (346.8 kB view details)

Uploaded CPython 3.14tmacOS 10.12+ x86-64

tonio-0.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl (595.9 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ x86-64

tonio-0.2.1-cp313-cp313t-musllinux_1_1_armv7l.whl (651.1 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ ARMv7l

tonio-0.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl (541.8 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.1+ ARM64

tonio-0.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (381.2 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

tonio-0.2.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (374.5 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARMv7l

tonio-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (364.1 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARM64

tonio-0.2.1-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.whl (406.8 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.12+ i686

tonio-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl (324.6 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

tonio-0.2.1-cp313-cp313t-macosx_10_12_x86_64.whl (346.5 kB view details)

Uploaded CPython 3.13tmacOS 10.12+ x86-64

File details

Details for the file tonio-0.2.1.tar.gz.

File metadata

  • Download URL: tonio-0.2.1.tar.gz
  • Upload date:
  • Size: 42.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tonio-0.2.1.tar.gz
Algorithm Hash digest
SHA256 06d73c5605639611f0cb76442dff0bbdad67bd2a3645f8545a5c5f462e8841d3
MD5 aa7508449439776ed2f346b483c9655d
BLAKE2b-256 b41fd6e31a61fcc436696e316133ccd760b26b4fe67416fb1bbffeab47c0eea8

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1.tar.gz:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a399395f0e2aef2740b75cee7f943b7f7054b79cd5a377ac46d6b3d6f15b953e
MD5 69406a1a075804ff6b8ebf4352b6e88a
BLAKE2b-256 05771337a38c8749a40cd0974dac81f6dead2710f7bd1c31f75852c87e4797f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-musllinux_1_1_x86_64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 04313229f56b2ae0250d758ee7ad3aa7e9b1eb1a3d33ee54e376dbf7e4ba6710
MD5 3c9cfb4b370ed45e8e101d123321621f
BLAKE2b-256 1584efcbe2384fff5909295ee922acf246bd1df8fbe87c4dc4e30c5e10731e7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-musllinux_1_1_armv7l.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 d69d23e2bb36e7c91dffa057de562cb8a2ebd2427c398b43122e9c48181d70fa
MD5 ab268b8bb6168db5ee2aa5279e424674
BLAKE2b-256 3dbecb9468929183f532d0f492816f5fea7bce9dd5a66e4a72788a9b5bccf1e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-musllinux_1_1_aarch64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d1995578d088d257c04e535ea51d3874c07c82f50d257e7692f80ae9c6d0fd6f
MD5 cfb0e8f26a34deae21886ab115af0811
BLAKE2b-256 7852ff0dd120b545bb1144d1aa7b65542beca7f576a311344b2112a71923613e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 287a6c7053b8155eab6aeefcd025841e02d5af616f64f9477f9e326f9165b8e3
MD5 d6038ae94879496196a034c1b850a028
BLAKE2b-256 fe4d98d66e5b50e571a131036e916bf955d4aab73f931a4b7a6c4a6b6fc05482

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a86fd772c0b755c2c2630ad41eb453bab823be00bce9c790c816b5aaa82c9d17
MD5 3d4b7719894b1a5c77c7232ebcc72d05
BLAKE2b-256 aba2f0fca7bb3b0eb028021e5c6593b48d986b60173bb74b6fe3cd1ac0108e80

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 4e6137294d86ba06d8fb17b3ebb4f745660aa34005ba270773dac9d11e393200
MD5 0ac0c610722efd9633d40b678ffbfcf2
BLAKE2b-256 ff9616bf0f9e8baf3f96c2d6eac73994a47a4638f6f50b11b4ab79ace0456685

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 274b0f0265f82440227527e28a273f74cec75b4435debca062a1c1de202af065
MD5 f72efa81f64c75049391e4006b77e39f
BLAKE2b-256 56695a5f7403ca0e3730a5e75c260b461fea014716d8834ea2b41fccacbf6e03

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp314-cp314t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp314-cp314t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 995cfcb81d687ae7976635f6b1bbb1a7aa1595de0ba848a9043a014b93f386fb
MD5 38c9680995186fa38dba670cb23fc7d8
BLAKE2b-256 6c32bff5b13d2b8c7f176b2888e7d4a318589e2345bc29b836390fbb321d7dea

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp314-cp314t-macosx_10_12_x86_64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 92eba94b477bd90a84d81006a054fff1b7d77790ac4f4177751884390793f025
MD5 d56218835fdfa4307a6f09ec5d48eaf6
BLAKE2b-256 9b7bc37a874804968f25529ef7221f7ad29687d93557df07e4753aba5d899889

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 35a2cbabb3e3b35ce49f8f5857d717d14f4ede865d9ef735849a87e47bed0829
MD5 e1618f61fb9cecac3c3889e5ea7b98cd
BLAKE2b-256 208535f630119b50ae59d3206e3b7cb4b17c99c3f1412cc6bd7891f06f711c24

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-musllinux_1_1_armv7l.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 c0781c4610aafe3cff7176195b358651e7511df4958cf1aff9bcbe3bd6eb811f
MD5 c875c5f982a9395425eed49a63789de7
BLAKE2b-256 e6d5bcacaba3e898cabe2650b29a73dad9da006d8b9d0a3752eb0438d339a924

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f323a5534fc1adfa79af52f31a045e4baa6ab051c7bfb0322b2efbf1734e75d
MD5 4fcb60588b312c16d3d3fd2a3a87c041
BLAKE2b-256 e4afc9ad291f37f1a0017fb0f4423bbffc0a827bf0816f58bba67e93d4a96200

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 d4bc3d56b7330d45e3a22a7d85d65a61ea1bf1f3aaf71e998af53a8e685539eb
MD5 df04b80560d6401d1f4057262e8e85c0
BLAKE2b-256 bd8ff7b5f0c9aadcddb41436e928c5539e6f99c894d6d365c48b02a7ceb6dec7

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 873cc42ad50996e3bbcef19650c150652c35c3d972a2a12834639e444f021aec
MD5 98084b178d787e4e10293814643fffd3
BLAKE2b-256 77e5a8fd39b2e94cece72a41c921cd3a04ec89853428cf7985fa883753928573

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 8e1d36b71c602604af7d6ae3c393c1449dd9332316c428f2858a1e8be0ae530d
MD5 74e75a2adfae02fa5225872cd1a5b06b
BLAKE2b-256 8ce73505f8ba2d5fc8f0d1b5af5f89843cca50f9e3f35b61c5c3a9a9ba9a197c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cc79eabb5496b65fafeeb2201025cdf15ae46496a891ac0dcfd04776f434311a
MD5 0a304e2608216295a7eb23dd690127e3
BLAKE2b-256 e19b7b2f7881a6cd394b5a5520097ef32f805fe2ba291b36b1d2839fa800e46b

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl:

Publisher: release.yml on gi0baro/tonio

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

File details

Details for the file tonio-0.2.1-cp313-cp313t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for tonio-0.2.1-cp313-cp313t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a522763bace196f4ddef782f9ef7b2fed9d3872bcb6003c595a85f109a581490
MD5 ee35d1a0f01fe95a564e11c1b8adbbe5
BLAKE2b-256 2ca579ddb5292b6b98733fd2eb00742eb228b0d2092321e10de964d2a6534d1a

See more details on using hashes here.

Provenance

The following attestation bundles were made for tonio-0.2.1-cp313-cp313t-macosx_10_12_x86_64.whl:

Publisher: release.yml on gi0baro/tonio

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page