Skip to main content

Up to 100x Faster FastAPI. JSON-RPC with io_uring, SIMD-acceleration, and pure CPython bindings

Project description

UCall

JSON Remote Procedure Calls Library
Up to 100x Faster than FastAPI


Discord     LinkedIn     Twitter     Blog     GitHub


Most modern networking is built either on slow and ambiguous REST APIs or unnecessarily complex gRPC. FastAPI, for example, looks very approachable. We aim to be equally or even simpler to use.

FastAPIUCall
pip install fastapi uvicorn
pip install ucall
from fastapi import FastAPI
import uvicorn

server = FastAPI()

@server.get('/sum')
def sum(a: int, b: int):
    return a + b

uvicorn.run(...)    
from ucall.posix import Server
# from ucall.uring import Server on 5.19+

server = Server()

@server
def sum(a: int, b: int):
    return a + b

server.run()    

It takes over a millisecond to handle a trivial FastAPI call on a recent 8-core CPU. In that time, light could have traveled 300 km through optics to the neighboring city or country, in my case. How does UCall compare to FastAPI and gRPC?

Setup 🔁 Server Latency w 1 client Throughput w 32 clients
Fast API over REST 🐍 1'203 μs 3'184 rps
Fast API over WebSocket 🐍 86 μs 11'356 rps ¹
gRPC ² 🐍 164 μs 9'849 rps
UCall with POSIX C 62 μs 79'000 rps
UCall with io_uring 🐍 40 μs 210'000 rps
UCall with io_uring C 22 μs 231'000 rps
Table legend

All benchmarks were conducted on AWS on general purpose instances with Ubuntu 22.10 AMI. It is the first major AMI to come with Linux Kernel 5.19, featuring much wider io_uring support for networking operations. These specific numbers were obtained on c7g.metal beefy instances with Graviton 3 chips.

  • The 🔁 column marks, if the TCP/IP connection is being reused during subsequent requests.
  • The "server" column defines the programming language, in which the server was implemented.
  • The "latency" column report the amount of time between sending a request and receiving a response. μ stands for micro, μs subsequently means microseconds.
  • The "throughput" column reports the number of Requests Per Second when querying the same server application from multiple client processes running on the same machine.

¹ FastAPI couldn't process concurrent requests with WebSockets.

² We tried generating C++ backends with gRPC, but its numbers, suspiciously, weren't better. There is also an async gRPC option, that wasn't tried.

How is that possible?!

How can a tiny pet-project with just a couple thousand lines of code compete with two of the most established networking libraries? UCall stands on the shoulders of Giants:

  • io_uring for interrupt-less IO.

    • io_uring_prep_read_fixed on 5.1+.
    • io_uring_prep_accept_direct on 5.19+.
    • io_uring_register_files_sparse on 5.19+.
    • IORING_SETUP_COOP_TASKRUN optional on 5.19+.
    • IORING_SETUP_SINGLE_ISSUER optional on 6.0+.
  • SIMD-accelerated parsers with manual memory control.

You have already seen the latency of the round trip..., the throughput in requests per second..., want to see the bandwidth? Try yourself!

@server
def echo(data: bytes):
    return data

More Functionality than FastAPI

FastAPI supports native type, while UCall supports numpy.ndarray, PIL.Image and other custom types. This comes handy when you build real applications or want to deploy Multi-Modal AI, like we do with UForm.

from ucall.rich_posix import Server
import ufrom

server = Server()
model = uform.get_model('unum-cloud/uform-vl-multilingual')

@server
def vectorize(description: str, photo: PIL.Image.Image) -> numpy.ndarray:
    image = model.preprocess_image(photo)
    tokens = model.preprocess_text(description)
    joint_embedding = model.encode_multimodal(image=image, text=tokens)

    return joint_embedding.cpu().detach().numpy()

We also have our own optional Client class that helps with those custom types.

from ucall.client import Client

client = Client()
# Explicit JSON-RPC call:
response = client({
    'method': 'vectorize',
    'params': {
        'description': description,
        'image': image,
    },
    'jsonrpc': '2.0',
    'id': 100,
})
# Or the same with syntactic sugar:
response = client.vectorize(description=description, image=image) 

CLI like cURL

Aside from the Python Client, we provide an easy-to-use Command Line Interface, which comes with pip install ucall. It allow you to call a remote server, upload files, with direct support for images and NumPy arrays. Translating previous example into a Bash script, to call the server on the same machine:

ucall vectorize description='Product description' -i image=./local/path.png

To address a remote server:

ucall vectorize description='Product description' -i image=./local/path.png --uri 0.0.0.0 -p 8545

To print the docs, use ucall -h:

usage: ucall [-h] [--uri URI] [--port PORT] [-f [FILE ...]] [-i [IMAGE ...]] [--positional [POSITIONAL ...]] method [kwargs ...]

UCall Client CLI

positional arguments:
  method                method name
  kwargs                method arguments

options:
  -h, --help            show this help message and exit
  --uri URI             server uri
  --port PORT           server port
  -f [FILE ...], --file [FILE ...]
                        method positional arguments
  -i [IMAGE ...], --image [IMAGE ...]
                        method positional arguments
  --positional [POSITIONAL ...]
                        method positional arguments

You can also explicitly annotate types, to distinguish integers, floats, and strings, to avoid ambiguity.

ucall auth id=256
ucall auth id:int=256
ucall auth id:str=256

Free Tier Throughput

We will leave bandwidth measurements to enthusiasts, but will share some more numbers. The general logic is that you can't squeeze high performance from Free-Tier machines. Currently AWS provides following options: t2.micro and t4g.small, on older Intel and newer Graviton 2 chips. This library is so fast, that it doesn't need more than 1 core, so you can run a fast server even on a tiny Free-Tier server!

Setup 🔁 Server Clients t2.micro t4g.small
Fast API over REST 🐍 1 328 rps 424 rps
Fast API over WebSocket 🐍 1 1'504 rps 3'051 rps
gRPC 🐍 1 1'169 rps 1'974 rps
UCall with POSIX C 1 1'082 rps 2'438 rps
UCall with io_uring C 1 - 5'864 rps
UCall with POSIX C 32 3'399 rps 39'877 rps
UCall with io_uring C 32 - 88'455 rps

In this case, every server was bombarded by requests from 1 or a fleet of 32 other instances in the same availability zone. If you want to reproduce those benchmarks, check out the sum examples on GitHub.

Quick Start

For Python:

pip install ucall

For CMake projects:

include(FetchContent)
FetchContent_Declare(
    ucall
    GIT_REPOSITORY https://github.com/unum-cloud/ucall
    GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(ucall)
include_directories(${ucall_SOURCE_DIR}/include)

The C usage example is mouthful compared to Python. We wanted to make it as lightweight as possible and to allow optional arguments without dynamic allocations and named lookups. So unlike the Python layer, we expect the user to manually extract the arguments from the call context with ucall_param_named_i64(), and its siblings.

#include <cstdio.h>
#include <ucall/ucall.h>

static void sum(ucall_call_t call, ucall_callback_tag_t) {
    int64_t a{}, b{};
    char printed_sum[256]{};
    bool got_a = ucall_param_named_i64(call, "a", 0, &a);
    bool got_b = ucall_param_named_i64(call, "b", 0, &b);
    if (!got_a || !got_b)
        return ucall_call_reply_error_invalid_params(call);

    int len = snprintf(printed_sum, 256, "%ll", a + b);
    ucall_call_reply_content(call, printed_sum, len);
}

int main(int argc, char** argv) {

    ucall_server_t server{};
    ucall_config_t config{};

    ucall_init(&config, &server);
    ucall_add_procedure(server, "sum", &sum, NULL);
    ucall_take_calls(server, 0);
    ucall_free(server);
    return 0;
}

Roadmap

  • Batch Requests
  • JSON-RPC over raw TCP sockets
  • JSON-RPC over TCP with HTTP
  • Concurrent sessions
  • NumPy array and Pillow serialization
  • HTTPS support
  • Batch-capable endpoints for ML
  • Zero-ETL relay calls
  • Integrating with UKV
  • WebSockets for web interfaces
  • AF_XDP and UDP-based analogs on Linux

Want to affect the roadmap and request a feature? Join the discussions on Discord.

Why JSON-RPC?

  • Transport independent: UDP, TCP, bring what you want.
  • Application layer is optional: use HTTP or not.
  • Unlike REST APIs, there is just one way to pass arguments.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

ucall-0.5.4-cp312-cp312-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.12 Windows x86-64

ucall-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

ucall-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

ucall-0.5.4-cp312-cp312-macosx_11_0_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.12 macOS 11.0+ x86-64

ucall-0.5.4-cp312-cp312-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.12 macOS 11.0+ universal2 (ARM64, x86-64)

ucall-0.5.4-cp312-cp312-macosx_11_0_arm64.whl (930.8 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

ucall-0.5.4-cp311-cp311-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.11 Windows x86-64

ucall-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

ucall-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

ucall-0.5.4-cp311-cp311-macosx_11_0_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.11 macOS 11.0+ x86-64

ucall-0.5.4-cp311-cp311-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.11 macOS 11.0+ universal2 (ARM64, x86-64)

ucall-0.5.4-cp311-cp311-macosx_11_0_arm64.whl (930.9 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

ucall-0.5.4-cp310-cp310-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.10 Windows x86-64

ucall-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

ucall-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

ucall-0.5.4-cp310-cp310-macosx_11_0_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

ucall-0.5.4-cp310-cp310-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.10 macOS 11.0+ universal2 (ARM64, x86-64)

ucall-0.5.4-cp310-cp310-macosx_11_0_arm64.whl (930.8 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

ucall-0.5.4-cp39-cp39-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.9 Windows x86-64

ucall-0.5.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

ucall-0.5.4-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

ucall-0.5.4-cp39-cp39-macosx_11_0_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

ucall-0.5.4-cp39-cp39-macosx_11_0_universal2.whl (1.9 MB view details)

Uploaded CPython 3.9 macOS 11.0+ universal2 (ARM64, x86-64)

ucall-0.5.4-cp39-cp39-macosx_11_0_arm64.whl (930.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

File details

Details for the file ucall-0.5.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ucall-0.5.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for ucall-0.5.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9f1cddfe32ee551fe5a3d0c1c1c1c9274afc2ecd8fa60ce4d55624ddb15f193e
MD5 9f4e268fe20c2a4df54640c45c83b84c
BLAKE2b-256 3f41247687fb37237c938316ce332cccbe8111dd719c99f1690b1b71e75d09ae

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 edd1d6c5e5aa48aac06df8ab101c3e738a7e04f9e6aaf65ddf34155aef6f5557
MD5 a6393963a935f979190e7b3259f0d721
BLAKE2b-256 e09bbfbe91a567ad0b737ea69d4fc638c9250e45077347e683c4a9e2d7fe8130

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4661e0f374e00eb9e3661c6a720387ec1073974370350fa0eb85e641593c0318
MD5 9a9435220f013c8c5910e83e392ec95b
BLAKE2b-256 10d2c3798571a911245733a79d10a2b0512d6c8990f5f59b055392fddcc40833

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6ab6361bbf4dacf73f054537411eb54c0884d2d11b8eb0bad7e4a3925f0302b2
MD5 b57654d03c281514040126105feb3699
BLAKE2b-256 ba5238becd9a5f136700d0b610f95404478d24feb7d7282a2975ffa429ef8a7f

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp312-cp312-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 f653c5b93a5c5e6b1581a92129586028f0cdd9eb45fc3f3758621f818c4175cd
MD5 48e4b706136ab008b6495e8970a2cd1a
BLAKE2b-256 1a40dd8f6cd762f5fa74a49dcb952d17ad7f2cf03ab617d0ff4b9dab3af45e4c

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2a19efb5ad137a7a00b96e1e1554fb557f5b4a9b056daf6f99d31509116e0103
MD5 4ae39b7da1ab926e045e9a14f02259f8
BLAKE2b-256 fc20626b9406137921280f29a331cd4c74c04ad470116706d2d608b13d4fa0ce

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: ucall-0.5.4-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for ucall-0.5.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 40738ed09504e7b2876ae50da2a07b0aa776b9b143b2847b19624116a3c92716
MD5 8464b7dba8bf603013fb06c7ce01fa5f
BLAKE2b-256 419affa73a234ef5df2846d2fb253e8688a4f3d8fec1b3223172e4eb6e331e8d

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d7678dd9525c4842984f5905e56f92f4b3743af7e0bb6bd72e39bae59b1d78a1
MD5 f29ebc4c00cd2a63655fe06855bae0b1
BLAKE2b-256 14bdaf253ca726c03f54e1290d67c0680ecefa8dba84a2a10ad27ad20365103c

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 586f078374826d889533efc9c5ce38e65e6dd1adb499f8440b4615b358d1138f
MD5 e961f5a9d42272644732d8e98c6bf607
BLAKE2b-256 b1a4214363271cb5e15b43c68d5179849631aef11607cc7f6b65f6b1c067b8af

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 e9b823a3b94d340e8806e4586b534049d13928de17a3711c9fc54b0529df5c82
MD5 ec6d6ba95083c99668f7bdaff9c98ba2
BLAKE2b-256 0e79cd5b9f3ec65d8b1cdf7b42b4acd940821b8e49af03edabe7a8f0e00ad9dd

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp311-cp311-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 731693b4803def57667cd2d4c2f5b64e910f5908703d200d5c14b1179cb7bc25
MD5 5d252556109f3e6e749a3d2f8400ed2a
BLAKE2b-256 a305af3925818cb407b32a3e0b8a6ee8b316948ea0af19a24359573966833d96

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 27947daab78a20d2760037cc557ae8072fa40187a4de1e1fbc45156fd17616a7
MD5 1436f47120c0d8b355e4cd16716a2b1b
BLAKE2b-256 40954738628dde8a4dae7f979a009d224f5dde1a7719c8a9536751eefdbf09c3

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: ucall-0.5.4-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for ucall-0.5.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 83611b0b10954c9f8cafd6ade2705e8073319d7b928584ee2951176545ce1a3f
MD5 63bd4cbc521cc4e6ed741a8b3e250678
BLAKE2b-256 386e715723f007f737238c7c395a0729bd58cb0a55d356d8ec7f32de81b5afac

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1aac14aaa17529e2c0a224092658389201cb549afe73651048d60504c7a646a8
MD5 f8465b6aedbdd23379bab97922965c56
BLAKE2b-256 aa0212721dafa10ab51acf4ae21eee9ff21f3deff19cf3f74555f415586c6aca

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1d4df5982894750ee579bf5d6e99b86b352b0c4ab586cc1a002607f73ea6949b
MD5 e0b4cd391dedf1d04eac63821898c797
BLAKE2b-256 4ab135bb775c6a174fe52683f1fe499f9e1f239a6d2e622752512986ad7d12da

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 3172f1df706545d70aa48735b56b9e25368f3245257043976b0f891224145d12
MD5 4772798558493dde374724e7160ea437
BLAKE2b-256 a993742ff708adc25437ee5ce9d0ff420f8d9c4c470a4c2a29741dcf08f61f2d

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp310-cp310-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c91bfaca7a243365fbf37b46f32113a407b4dc232ae7f1789eab6cf0173a598e
MD5 f01e77200d9d97626f9cacea3f2ad301
BLAKE2b-256 9d28953727c89008c2338b07913fa6e2ecf5a0de8d469e4d4ff8433e04558ea8

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8bddc550a8642f74f28a15595af1f31f45a02b41bf4f4b4d85e21481afdebedd
MD5 d01638e85ae64d179a6c33fdf1c437f3
BLAKE2b-256 d7ac83bce3f20a853fa2d9ada22e772dee2cb1b9346fa2b4f193bdc4318de421

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: ucall-0.5.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for ucall-0.5.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 99dec59f7406ca53e33cf70a8f8b1e02c1aad323b6934149d7195772ac2a252b
MD5 976d5d33aa91b4e9a20e253db76a8f2b
BLAKE2b-256 2ab239efa711ab3ef61c7f3f90882aa1bc2ce9c8e9161ac572f81c0ae441ab09

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 39beb76d1b61e34492a1cdb3733e72b6b1b381b19883230b6c337201da5c2341
MD5 35562f344a3ec470eedf73f8401d945d
BLAKE2b-256 16120fcda593abc38f2ae79187a4ab635d78d739783fac3db4585c2d3dc0394e

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 550f5f679049271381f7a2ba2d328a8858878706b766363ff93849dbec9d40db
MD5 8d7143e5ce7dd85fb0415ac892f03783
BLAKE2b-256 df4ee0d28ee1c588a40b4b9ff31fe4b5ea3a2713ceeb646b6781081e28c25c62

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 528e30408c39f8124ef123ab1f097d9016a185f8677bd1ca4f8dc3ee87201169
MD5 9e2daa4a43ddeacdc6e61585ed94c225
BLAKE2b-256 611501c79f770f96bc4ccb70a54add996883601fdec90404950447d026a8f305

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp39-cp39-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp39-cp39-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3a26530ed45147dfac9459664f70769e871ff6cf9858421814c93b37aba1dc50
MD5 a4011427da7033105bb738a9223c30ab
BLAKE2b-256 43ff7699c442f414fca16db656f7a513a77780084101d8a985c94f9859430a3c

See more details on using hashes here.

File details

Details for the file ucall-0.5.4-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ucall-0.5.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c1482992b6e6343a242b9ab9375509cb2018601627558e80310aa4e27223047c
MD5 02f5074e902188cb047150ce30836741
BLAKE2b-256 eb56513bca02dfec0dcc62780d30cacd81997b1ac8511426206391ca4a71fd6e

See more details on using hashes here.

Supported by

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