ucall


Nameucall JSON
Version 0.5.4 PyPI version JSON
download
home_pagehttps://github.com/unum-cloud/ucall
SummaryUp to 100x Faster FastAPI. JSON-RPC with io_uring, SIMD-acceleration, and pure CPython bindings
upload_time2024-04-15 06:07:54
maintainerNone
docs_urlNone
authorAsh Vardanian
requires_python>=3.9
licenseApache-2.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <h1 align="center">UCall</h1>
<h3 align="center">
JSON Remote Procedure Calls Library<br/>
Up to 100x Faster than FastAPI<br/>
</h3>
<br/>

<p align="center">
<a href="https://discord.gg/xuDmpbEDnQ"><img height="25" src="https://github.com/unum-cloud/ukv/raw/main/assets/icons/discord.svg" alt="Discord"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://www.linkedin.com/company/unum-cloud/"><img height="25" src="https://github.com/unum-cloud/ukv/raw/main/assets/icons/linkedin.svg" alt="LinkedIn"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://twitter.com/unum_cloud"><img height="25" src="https://github.com/unum-cloud/ukv/raw/main/assets/icons/twitter.svg" alt="Twitter"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://unum.cloud/post"><img height="25" src="https://github.com/unum-cloud/ukv/raw/main/assets/icons/blog.svg" alt="Blog"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://github.com/unum-cloud/ucall"><img height="25" src="https://github.com/unum-cloud/ukv/raw/main/assets/icons/github.svg" alt="GitHub"></a>
</p>

---

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.

<table width="100%">
<tr>
<th width="50%">FastAPI</th><th width="50%">UCall</th>
</tr>
<tr>
<td>

```sh
pip install fastapi uvicorn
```

</td>
<td>

```sh
pip install ucall
```

</td>
</tr>
<tr>
<td>

```python
from fastapi import FastAPI
import uvicorn

server = FastAPI()

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

uvicorn.run(...)    
```

</td>
<td>

```python
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()    
```

</td>
</tr>
</table>

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 |

<details>
  <summary>Table legend</summary>

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.

</details>

## 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.
  - [`simdjson`][simdjson] to parse JSON faster than gRPC can unpack `ProtoBuf`.
  - [`Turbo-Base64`][base64] to decode binary values from a `Base64` form.
  - [`picohttpparser`][picohttpparser] to navigate HTTP headers.

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

```python
@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](https://github.com/unum-cloud/uform).

```python
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.

```python
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](https://curl.se/docs/manpage.html)

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:

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

To address a remote server:

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

To print the docs, use `ucall -h`:

```txt
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][sum-examples].

## Quick Start

For Python:

```sh
pip install ucall
```

For CMake projects:

```cmake
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.

```c
#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

- [x] Batch Requests
- [x] JSON-RPC over raw TCP sockets
- [x] JSON-RPC over TCP with HTTP
- [x] Concurrent sessions
- [x] NumPy `array` and Pillow serialization
- [ ] HTTP**S** support
- [ ] Batch-capable endpoints for ML
- [ ] Zero-ETL relay calls
- [ ] Integrating with [UKV][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.

[simdjson]: https://github.com/simdjson/simdjson
[base64]: https://github.com/powturbo/Turbo-Base64
[picohttpparser]: https://github.com/h2o/picohttpparser
[sum-examples]: https://github.com/unum-cloud/ucall/tree/dev/examples/sum
[ukv]: https://github.com/unum-cloud/ukv

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/unum-cloud/ucall",
    "name": "ucall",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": null,
    "author": "Ash Vardanian",
    "author_email": "info@unum.cloud",
    "download_url": null,
    "platform": null,
    "description": "<h1 align=\"center\">UCall</h1>\n<h3 align=\"center\">\nJSON Remote Procedure Calls Library<br/>\nUp to 100x Faster than FastAPI<br/>\n</h3>\n<br/>\n\n<p align=\"center\">\n<a href=\"https://discord.gg/xuDmpbEDnQ\"><img height=\"25\" src=\"https://github.com/unum-cloud/ukv/raw/main/assets/icons/discord.svg\" alt=\"Discord\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://www.linkedin.com/company/unum-cloud/\"><img height=\"25\" src=\"https://github.com/unum-cloud/ukv/raw/main/assets/icons/linkedin.svg\" alt=\"LinkedIn\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://twitter.com/unum_cloud\"><img height=\"25\" src=\"https://github.com/unum-cloud/ukv/raw/main/assets/icons/twitter.svg\" alt=\"Twitter\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://unum.cloud/post\"><img height=\"25\" src=\"https://github.com/unum-cloud/ukv/raw/main/assets/icons/blog.svg\" alt=\"Blog\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://github.com/unum-cloud/ucall\"><img height=\"25\" src=\"https://github.com/unum-cloud/ukv/raw/main/assets/icons/github.svg\" alt=\"GitHub\"></a>\n</p>\n\n---\n\nMost modern networking is built either on slow and ambiguous REST APIs or unnecessarily complex gRPC.\nFastAPI, for example, looks very approachable.\nWe aim to be equally or even simpler to use.\n\n<table width=\"100%\">\n<tr>\n<th width=\"50%\">FastAPI</th><th width=\"50%\">UCall</th>\n</tr>\n<tr>\n<td>\n\n```sh\npip install fastapi uvicorn\n```\n\n</td>\n<td>\n\n```sh\npip install ucall\n```\n\n</td>\n</tr>\n<tr>\n<td>\n\n```python\nfrom fastapi import FastAPI\nimport uvicorn\n\nserver = FastAPI()\n\n@server.get('/sum')\ndef sum(a: int, b: int):\n    return a + b\n\nuvicorn.run(...)    \n```\n\n</td>\n<td>\n\n```python\nfrom ucall.posix import Server\n# from ucall.uring import Server on 5.19+\n\nserver = Server()\n\n@server\ndef sum(a: int, b: int):\n    return a + b\n\nserver.run()    \n```\n\n</td>\n</tr>\n</table>\n\nIt takes over a millisecond to handle a trivial FastAPI call on a recent 8-core CPU.\nIn that time, light could have traveled 300 km through optics to the neighboring city or country, in my case.\nHow does UCall compare to FastAPI and gRPC?\n\n| Setup                   |   \ud83d\udd01   | Server | Latency w 1 client | Throughput w 32 clients |\n| :---------------------- | :---: | :----: | -----------------: | ----------------------: |\n| Fast API over REST      |   \u274c   |   \ud83d\udc0d    |           1'203 \u03bcs |               3'184 rps |\n| Fast API over WebSocket |   \u2705   |   \ud83d\udc0d    |              86 \u03bcs |            11'356 rps \u00b9 |\n| gRPC \u00b2                  |   \u2705   |   \ud83d\udc0d    |             164 \u03bcs |               9'849 rps |\n|                         |       |        |                    |                         |\n| UCall with POSIX        |   \u274c   |   C    |              62 \u03bcs |              79'000 rps |\n| UCall with io_uring     |   \u2705   |   \ud83d\udc0d    |              40 \u03bcs |             210'000 rps |\n| UCall with io_uring     |   \u2705   |   C    |              22 \u03bcs |             231'000 rps |\n\n<details>\n  <summary>Table legend</summary>\n\nAll benchmarks were conducted on AWS on general purpose instances with **Ubuntu 22.10 AMI**.\nIt is the first major AMI to come with **Linux Kernel 5.19**, featuring much wider `io_uring` support for networking operations.\nThese specific numbers were obtained on `c7g.metal` beefy instances with Graviton 3 chips.\n\n- The \ud83d\udd01 column marks, if the TCP/IP connection is being reused during subsequent requests.\n- The \"server\" column defines the programming language, in which the server was implemented.\n- The \"latency\" column report the amount of time between sending a request and receiving a response. \u03bc stands for micro, \u03bcs subsequently means microseconds.\n- 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.\n\n> \u00b9 FastAPI couldn't process concurrent requests with WebSockets.\n\n> \u00b2 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.\n\n</details>\n\n## How is that possible?!\n\nHow can a tiny pet-project with just a couple thousand lines of code compete with two of the most established networking libraries?\n**UCall stands on the shoulders of Giants**:\n\n- `io_uring` for interrupt-less IO.\n  - `io_uring_prep_read_fixed` on 5.1+.\n  - `io_uring_prep_accept_direct` on 5.19+.\n  - `io_uring_register_files_sparse` on 5.19+.\n  - `IORING_SETUP_COOP_TASKRUN` optional on 5.19+.\n  - `IORING_SETUP_SINGLE_ISSUER` optional on 6.0+.\n\n- SIMD-accelerated parsers with manual memory control.\n  - [`simdjson`][simdjson] to parse JSON faster than gRPC can unpack `ProtoBuf`.\n  - [`Turbo-Base64`][base64] to decode binary values from a `Base64` form.\n  - [`picohttpparser`][picohttpparser] to navigate HTTP headers.\n\nYou have already seen the latency of the round trip..., the throughput in requests per second..., want to see the bandwidth?\nTry yourself!\n\n```python\n@server\ndef echo(data: bytes):\n    return data\n```\n\n## More Functionality than FastAPI\n\nFastAPI supports native type, while UCall supports `numpy.ndarray`, `PIL.Image` and other custom types.\nThis comes handy when you build real applications or want to deploy Multi-Modal AI, like we do with [UForm](https://github.com/unum-cloud/uform).\n\n```python\nfrom ucall.rich_posix import Server\nimport ufrom\n\nserver = Server()\nmodel = uform.get_model('unum-cloud/uform-vl-multilingual')\n\n@server\ndef vectorize(description: str, photo: PIL.Image.Image) -> numpy.ndarray:\n    image = model.preprocess_image(photo)\n    tokens = model.preprocess_text(description)\n    joint_embedding = model.encode_multimodal(image=image, text=tokens)\n\n    return joint_embedding.cpu().detach().numpy()\n```\n\nWe also have our own optional `Client` class that helps with those custom types.\n\n```python\nfrom ucall.client import Client\n\nclient = Client()\n# Explicit JSON-RPC call:\nresponse = client({\n    'method': 'vectorize',\n    'params': {\n        'description': description,\n        'image': image,\n    },\n    'jsonrpc': '2.0',\n    'id': 100,\n})\n# Or the same with syntactic sugar:\nresponse = client.vectorize(description=description, image=image) \n```\n\n## CLI like [cURL](https://curl.se/docs/manpage.html)\n\nAside from the Python `Client`, we provide an easy-to-use Command Line Interface, which comes with `pip install ucall`.\nIt allow you to call a remote server, upload files, with direct support for images and NumPy arrays.\nTranslating previous example into a Bash script, to call the server on the same machine:\n\n```sh\nucall vectorize description='Product description' -i image=./local/path.png\n```\n\nTo address a remote server:\n\n```sh\nucall vectorize description='Product description' -i image=./local/path.png --uri 0.0.0.0 -p 8545\n```\n\nTo print the docs, use `ucall -h`:\n\n```txt\nusage: ucall [-h] [--uri URI] [--port PORT] [-f [FILE ...]] [-i [IMAGE ...]] [--positional [POSITIONAL ...]] method [kwargs ...]\n\nUCall Client CLI\n\npositional arguments:\n  method                method name\n  kwargs                method arguments\n\noptions:\n  -h, --help            show this help message and exit\n  --uri URI             server uri\n  --port PORT           server port\n  -f [FILE ...], --file [FILE ...]\n                        method positional arguments\n  -i [IMAGE ...], --image [IMAGE ...]\n                        method positional arguments\n  --positional [POSITIONAL ...]\n                        method positional arguments\n```\n\nYou can also explicitly annotate types, to distinguish integers, floats, and strings, to avoid ambiguity.\n\n```\nucall auth id=256\nucall auth id:int=256\nucall auth id:str=256\n```\n\n## Free Tier Throughput\n\nWe will leave bandwidth measurements to enthusiasts, but will share some more numbers.\nThe general logic is that you can't squeeze high performance from Free-Tier machines.\nCurrently AWS provides following options: `t2.micro` and `t4g.small`, on older Intel and newer Graviton 2 chips.\nThis 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!\n\n| Setup                   |   \ud83d\udd01   | Server | Clients | `t2.micro` | `t4g.small` |\n| :---------------------- | :---: | :----: | :-----: | ---------: | ----------: |\n| Fast API over REST      |   \u274c   |   \ud83d\udc0d    |    1    |    328 rps |     424 rps |\n| Fast API over WebSocket |   \u2705   |   \ud83d\udc0d    |    1    |  1'504 rps |   3'051 rps |\n| gRPC                    |   \u2705   |   \ud83d\udc0d    |    1    |  1'169 rps |   1'974 rps |\n|                         |       |        |         |            |             |\n| UCall with POSIX        |   \u274c   |   C    |    1    |  1'082 rps |   2'438 rps |\n| UCall with io_uring     |   \u2705   |   C    |    1    |          - |   5'864 rps |\n| UCall with POSIX        |   \u274c   |   C    |   32    |  3'399 rps |  39'877 rps |\n| UCall with io_uring     |   \u2705   |   C    |   32    |          - |  88'455 rps |\n\nIn this case, every server was bombarded by requests from 1 or a fleet of 32 other instances in the same availability zone.\nIf you want to reproduce those benchmarks, check out the [`sum` examples on GitHub][sum-examples].\n\n## Quick Start\n\nFor Python:\n\n```sh\npip install ucall\n```\n\nFor CMake projects:\n\n```cmake\ninclude(FetchContent)\nFetchContent_Declare(\n    ucall\n    GIT_REPOSITORY https://github.com/unum-cloud/ucall\n    GIT_SHALLOW TRUE\n)\nFetchContent_MakeAvailable(ucall)\ninclude_directories(${ucall_SOURCE_DIR}/include)\n```\n\nThe C usage example is mouthful compared to Python.\nWe wanted to make it as lightweight as possible and to allow optional arguments without dynamic allocations and named lookups.\nSo 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.\n\n```c\n#include <cstdio.h>\n#include <ucall/ucall.h>\n\nstatic void sum(ucall_call_t call, ucall_callback_tag_t) {\n    int64_t a{}, b{};\n    char printed_sum[256]{};\n    bool got_a = ucall_param_named_i64(call, \"a\", 0, &a);\n    bool got_b = ucall_param_named_i64(call, \"b\", 0, &b);\n    if (!got_a || !got_b)\n        return ucall_call_reply_error_invalid_params(call);\n\n    int len = snprintf(printed_sum, 256, \"%ll\", a + b);\n    ucall_call_reply_content(call, printed_sum, len);\n}\n\nint main(int argc, char** argv) {\n\n    ucall_server_t server{};\n    ucall_config_t config{};\n\n    ucall_init(&config, &server);\n    ucall_add_procedure(server, \"sum\", &sum, NULL);\n    ucall_take_calls(server, 0);\n    ucall_free(server);\n    return 0;\n}\n```\n\n## Roadmap\n\n- [x] Batch Requests\n- [x] JSON-RPC over raw TCP sockets\n- [x] JSON-RPC over TCP with HTTP\n- [x] Concurrent sessions\n- [x] NumPy `array` and Pillow serialization\n- [ ] HTTP**S** support\n- [ ] Batch-capable endpoints for ML\n- [ ] Zero-ETL relay calls\n- [ ] Integrating with [UKV][ukv]\n- [ ] WebSockets for web interfaces\n- [ ] AF_XDP and UDP-based analogs on Linux\n\n> Want to affect the roadmap and request a feature? Join the discussions on Discord.\n\n## Why JSON-RPC?\n\n- Transport independent: UDP, TCP, bring what you want.\n- Application layer is optional: use HTTP or not.\n- Unlike REST APIs, there is just one way to pass arguments.\n\n[simdjson]: https://github.com/simdjson/simdjson\n[base64]: https://github.com/powturbo/Turbo-Base64\n[picohttpparser]: https://github.com/h2o/picohttpparser\n[sum-examples]: https://github.com/unum-cloud/ucall/tree/dev/examples/sum\n[ukv]: https://github.com/unum-cloud/ukv\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Up to 100x Faster FastAPI. JSON-RPC with io_uring, SIMD-acceleration, and pure CPython bindings",
    "version": "0.5.4",
    "project_urls": {
        "Homepage": "https://github.com/unum-cloud/ucall"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d7ac83bce3f20a853fa2d9ada22e772dee2cb1b9346fa2b4f193bdc4318de421",
                "md5": "d01638e85ae64d179a6c33fdf1c437f3",
                "sha256": "8bddc550a8642f74f28a15595af1f31f45a02b41bf4f4b4d85e21481afdebedd"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d01638e85ae64d179a6c33fdf1c437f3",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 930848,
            "upload_time": "2024-04-15T06:07:54",
            "upload_time_iso_8601": "2024-04-15T06:07:54.951470Z",
            "url": "https://files.pythonhosted.org/packages/d7/ac/83bce3f20a853fa2d9ada22e772dee2cb1b9346fa2b4f193bdc4318de421/ucall-0.5.4-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9d28953727c89008c2338b07913fa6e2ecf5a0de8d469e4d4ff8433e04558ea8",
                "md5": "f01e77200d9d97626f9cacea3f2ad301",
                "sha256": "c91bfaca7a243365fbf37b46f32113a407b4dc232ae7f1789eab6cf0173a598e"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp310-cp310-macosx_11_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "f01e77200d9d97626f9cacea3f2ad301",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1949102,
            "upload_time": "2024-04-15T06:07:57",
            "upload_time_iso_8601": "2024-04-15T06:07:57.612847Z",
            "url": "https://files.pythonhosted.org/packages/9d/28/953727c89008c2338b07913fa6e2ecf5a0de8d469e4d4ff8433e04558ea8/ucall-0.5.4-cp310-cp310-macosx_11_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a993742ff708adc25437ee5ce9d0ff420f8d9c4c470a4c2a29741dcf08f61f2d",
                "md5": "4772798558493dde374724e7160ea437",
                "sha256": "3172f1df706545d70aa48735b56b9e25368f3245257043976b0f891224145d12"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp310-cp310-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4772798558493dde374724e7160ea437",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1036075,
            "upload_time": "2024-04-15T06:08:00",
            "upload_time_iso_8601": "2024-04-15T06:08:00.129103Z",
            "url": "https://files.pythonhosted.org/packages/a9/93/742ff708adc25437ee5ce9d0ff420f8d9c4c470a4c2a29741dcf08f61f2d/ucall-0.5.4-cp310-cp310-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4ab135bb775c6a174fe52683f1fe499f9e1f239a6d2e622752512986ad7d12da",
                "md5": "e0b4cd391dedf1d04eac63821898c797",
                "sha256": "1d4df5982894750ee579bf5d6e99b86b352b0c4ab586cc1a002607f73ea6949b"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "e0b4cd391dedf1d04eac63821898c797",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1172677,
            "upload_time": "2024-04-15T06:08:02",
            "upload_time_iso_8601": "2024-04-15T06:08:02.262236Z",
            "url": "https://files.pythonhosted.org/packages/4a/b1/35bb775c6a174fe52683f1fe499f9e1f239a6d2e622752512986ad7d12da/ucall-0.5.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aa0212721dafa10ab51acf4ae21eee9ff21f3deff19cf3f74555f415586c6aca",
                "md5": "f8465b6aedbdd23379bab97922965c56",
                "sha256": "1aac14aaa17529e2c0a224092658389201cb549afe73651048d60504c7a646a8"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f8465b6aedbdd23379bab97922965c56",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1337129,
            "upload_time": "2024-04-15T06:08:04",
            "upload_time_iso_8601": "2024-04-15T06:08:04.930425Z",
            "url": "https://files.pythonhosted.org/packages/aa/02/12721dafa10ab51acf4ae21eee9ff21f3deff19cf3f74555f415586c6aca/ucall-0.5.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "386e715723f007f737238c7c395a0729bd58cb0a55d356d8ec7f32de81b5afac",
                "md5": "63bd4cbc521cc4e6ed741a8b3e250678",
                "sha256": "83611b0b10954c9f8cafd6ade2705e8073319d7b928584ee2951176545ce1a3f"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "63bd4cbc521cc4e6ed741a8b3e250678",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1371767,
            "upload_time": "2024-04-15T06:08:07",
            "upload_time_iso_8601": "2024-04-15T06:08:07.439817Z",
            "url": "https://files.pythonhosted.org/packages/38/6e/715723f007f737238c7c395a0729bd58cb0a55d356d8ec7f32de81b5afac/ucall-0.5.4-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "40954738628dde8a4dae7f979a009d224f5dde1a7719c8a9536751eefdbf09c3",
                "md5": "1436f47120c0d8b355e4cd16716a2b1b",
                "sha256": "27947daab78a20d2760037cc557ae8072fa40187a4de1e1fbc45156fd17616a7"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "1436f47120c0d8b355e4cd16716a2b1b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 930859,
            "upload_time": "2024-04-15T06:08:09",
            "upload_time_iso_8601": "2024-04-15T06:08:09.659466Z",
            "url": "https://files.pythonhosted.org/packages/40/95/4738628dde8a4dae7f979a009d224f5dde1a7719c8a9536751eefdbf09c3/ucall-0.5.4-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a305af3925818cb407b32a3e0b8a6ee8b316948ea0af19a24359573966833d96",
                "md5": "5d252556109f3e6e749a3d2f8400ed2a",
                "sha256": "731693b4803def57667cd2d4c2f5b64e910f5908703d200d5c14b1179cb7bc25"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp311-cp311-macosx_11_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "5d252556109f3e6e749a3d2f8400ed2a",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1949096,
            "upload_time": "2024-04-15T06:08:12",
            "upload_time_iso_8601": "2024-04-15T06:08:12.304610Z",
            "url": "https://files.pythonhosted.org/packages/a3/05/af3925818cb407b32a3e0b8a6ee8b316948ea0af19a24359573966833d96/ucall-0.5.4-cp311-cp311-macosx_11_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0e79cd5b9f3ec65d8b1cdf7b42b4acd940821b8e49af03edabe7a8f0e00ad9dd",
                "md5": "ec6d6ba95083c99668f7bdaff9c98ba2",
                "sha256": "e9b823a3b94d340e8806e4586b534049d13928de17a3711c9fc54b0529df5c82"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp311-cp311-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ec6d6ba95083c99668f7bdaff9c98ba2",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1036072,
            "upload_time": "2024-04-15T06:08:14",
            "upload_time_iso_8601": "2024-04-15T06:08:14.660312Z",
            "url": "https://files.pythonhosted.org/packages/0e/79/cd5b9f3ec65d8b1cdf7b42b4acd940821b8e49af03edabe7a8f0e00ad9dd/ucall-0.5.4-cp311-cp311-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b1a4214363271cb5e15b43c68d5179849631aef11607cc7f6b65f6b1c067b8af",
                "md5": "e961f5a9d42272644732d8e98c6bf607",
                "sha256": "586f078374826d889533efc9c5ce38e65e6dd1adb499f8440b4615b358d1138f"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "e961f5a9d42272644732d8e98c6bf607",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1172675,
            "upload_time": "2024-04-15T06:08:17",
            "upload_time_iso_8601": "2024-04-15T06:08:17.166958Z",
            "url": "https://files.pythonhosted.org/packages/b1/a4/214363271cb5e15b43c68d5179849631aef11607cc7f6b65f6b1c067b8af/ucall-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "14bdaf253ca726c03f54e1290d67c0680ecefa8dba84a2a10ad27ad20365103c",
                "md5": "f29ebc4c00cd2a63655fe06855bae0b1",
                "sha256": "d7678dd9525c4842984f5905e56f92f4b3743af7e0bb6bd72e39bae59b1d78a1"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f29ebc4c00cd2a63655fe06855bae0b1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1337132,
            "upload_time": "2024-04-15T06:08:19",
            "upload_time_iso_8601": "2024-04-15T06:08:19.294232Z",
            "url": "https://files.pythonhosted.org/packages/14/bd/af253ca726c03f54e1290d67c0680ecefa8dba84a2a10ad27ad20365103c/ucall-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "419affa73a234ef5df2846d2fb253e8688a4f3d8fec1b3223172e4eb6e331e8d",
                "md5": "8464b7dba8bf603013fb06c7ce01fa5f",
                "sha256": "40738ed09504e7b2876ae50da2a07b0aa776b9b143b2847b19624116a3c92716"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "8464b7dba8bf603013fb06c7ce01fa5f",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1371747,
            "upload_time": "2024-04-15T06:08:21",
            "upload_time_iso_8601": "2024-04-15T06:08:21.191193Z",
            "url": "https://files.pythonhosted.org/packages/41/9a/ffa73a234ef5df2846d2fb253e8688a4f3d8fec1b3223172e4eb6e331e8d/ucall-0.5.4-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fc20626b9406137921280f29a331cd4c74c04ad470116706d2d608b13d4fa0ce",
                "md5": "4ae39b7da1ab926e045e9a14f02259f8",
                "sha256": "2a19efb5ad137a7a00b96e1e1554fb557f5b4a9b056daf6f99d31509116e0103"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "4ae39b7da1ab926e045e9a14f02259f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 930804,
            "upload_time": "2024-04-15T06:08:22",
            "upload_time_iso_8601": "2024-04-15T06:08:22.414840Z",
            "url": "https://files.pythonhosted.org/packages/fc/20/626b9406137921280f29a331cd4c74c04ad470116706d2d608b13d4fa0ce/ucall-0.5.4-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1a40dd8f6cd762f5fa74a49dcb952d17ad7f2cf03ab617d0ff4b9dab3af45e4c",
                "md5": "48e4b706136ab008b6495e8970a2cd1a",
                "sha256": "f653c5b93a5c5e6b1581a92129586028f0cdd9eb45fc3f3758621f818c4175cd"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp312-cp312-macosx_11_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "48e4b706136ab008b6495e8970a2cd1a",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1948991,
            "upload_time": "2024-04-15T06:08:23",
            "upload_time_iso_8601": "2024-04-15T06:08:23.660516Z",
            "url": "https://files.pythonhosted.org/packages/1a/40/dd8f6cd762f5fa74a49dcb952d17ad7f2cf03ab617d0ff4b9dab3af45e4c/ucall-0.5.4-cp312-cp312-macosx_11_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ba5238becd9a5f136700d0b610f95404478d24feb7d7282a2975ffa429ef8a7f",
                "md5": "b57654d03c281514040126105feb3699",
                "sha256": "6ab6361bbf4dacf73f054537411eb54c0884d2d11b8eb0bad7e4a3925f0302b2"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp312-cp312-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b57654d03c281514040126105feb3699",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1036045,
            "upload_time": "2024-04-15T06:08:25",
            "upload_time_iso_8601": "2024-04-15T06:08:25.169909Z",
            "url": "https://files.pythonhosted.org/packages/ba/52/38becd9a5f136700d0b610f95404478d24feb7d7282a2975ffa429ef8a7f/ucall-0.5.4-cp312-cp312-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "10d2c3798571a911245733a79d10a2b0512d6c8990f5f59b055392fddcc40833",
                "md5": "9a9435220f013c8c5910e83e392ec95b",
                "sha256": "4661e0f374e00eb9e3661c6a720387ec1073974370350fa0eb85e641593c0318"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "9a9435220f013c8c5910e83e392ec95b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1172817,
            "upload_time": "2024-04-15T06:08:27",
            "upload_time_iso_8601": "2024-04-15T06:08:27.743715Z",
            "url": "https://files.pythonhosted.org/packages/10/d2/c3798571a911245733a79d10a2b0512d6c8990f5f59b055392fddcc40833/ucall-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e09bbfbe91a567ad0b737ea69d4fc638c9250e45077347e683c4a9e2d7fe8130",
                "md5": "a6393963a935f979190e7b3259f0d721",
                "sha256": "edd1d6c5e5aa48aac06df8ab101c3e738a7e04f9e6aaf65ddf34155aef6f5557"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a6393963a935f979190e7b3259f0d721",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1337231,
            "upload_time": "2024-04-15T06:08:29",
            "upload_time_iso_8601": "2024-04-15T06:08:29.681614Z",
            "url": "https://files.pythonhosted.org/packages/e0/9b/bfbe91a567ad0b737ea69d4fc638c9250e45077347e683c4a9e2d7fe8130/ucall-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3f41247687fb37237c938316ce332cccbe8111dd719c99f1690b1b71e75d09ae",
                "md5": "9f4e268fe20c2a4df54640c45c83b84c",
                "sha256": "9f1cddfe32ee551fe5a3d0c1c1c1c9274afc2ecd8fa60ce4d55624ddb15f193e"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9f4e268fe20c2a4df54640c45c83b84c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1371774,
            "upload_time": "2024-04-15T06:08:31",
            "upload_time_iso_8601": "2024-04-15T06:08:31.587937Z",
            "url": "https://files.pythonhosted.org/packages/3f/41/247687fb37237c938316ce332cccbe8111dd719c99f1690b1b71e75d09ae/ucall-0.5.4-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eb56513bca02dfec0dcc62780d30cacd81997b1ac8511426206391ca4a71fd6e",
                "md5": "02f5074e902188cb047150ce30836741",
                "sha256": "c1482992b6e6343a242b9ab9375509cb2018601627558e80310aa4e27223047c"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "02f5074e902188cb047150ce30836741",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 930867,
            "upload_time": "2024-04-15T06:08:33",
            "upload_time_iso_8601": "2024-04-15T06:08:33.001973Z",
            "url": "https://files.pythonhosted.org/packages/eb/56/513bca02dfec0dcc62780d30cacd81997b1ac8511426206391ca4a71fd6e/ucall-0.5.4-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "43ff7699c442f414fca16db656f7a513a77780084101d8a985c94f9859430a3c",
                "md5": "a4011427da7033105bb738a9223c30ab",
                "sha256": "3a26530ed45147dfac9459664f70769e871ff6cf9858421814c93b37aba1dc50"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp39-cp39-macosx_11_0_universal2.whl",
            "has_sig": false,
            "md5_digest": "a4011427da7033105bb738a9223c30ab",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1949160,
            "upload_time": "2024-04-15T06:08:34",
            "upload_time_iso_8601": "2024-04-15T06:08:34.223675Z",
            "url": "https://files.pythonhosted.org/packages/43/ff/7699c442f414fca16db656f7a513a77780084101d8a985c94f9859430a3c/ucall-0.5.4-cp39-cp39-macosx_11_0_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "611501c79f770f96bc4ccb70a54add996883601fdec90404950447d026a8f305",
                "md5": "9e2daa4a43ddeacdc6e61585ed94c225",
                "sha256": "528e30408c39f8124ef123ab1f097d9016a185f8677bd1ca4f8dc3ee87201169"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp39-cp39-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9e2daa4a43ddeacdc6e61585ed94c225",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1036102,
            "upload_time": "2024-04-15T06:08:35",
            "upload_time_iso_8601": "2024-04-15T06:08:35.523934Z",
            "url": "https://files.pythonhosted.org/packages/61/15/01c79f770f96bc4ccb70a54add996883601fdec90404950447d026a8f305/ucall-0.5.4-cp39-cp39-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "df4ee0d28ee1c588a40b4b9ff31fe4b5ea3a2713ceeb646b6781081e28c25c62",
                "md5": "8d7143e5ce7dd85fb0415ac892f03783",
                "sha256": "550f5f679049271381f7a2ba2d328a8858878706b766363ff93849dbec9d40db"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "8d7143e5ce7dd85fb0415ac892f03783",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1172652,
            "upload_time": "2024-04-15T06:08:36",
            "upload_time_iso_8601": "2024-04-15T06:08:36.808659Z",
            "url": "https://files.pythonhosted.org/packages/df/4e/e0d28ee1c588a40b4b9ff31fe4b5ea3a2713ceeb646b6781081e28c25c62/ucall-0.5.4-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "16120fcda593abc38f2ae79187a4ab635d78d739783fac3db4585c2d3dc0394e",
                "md5": "35562f344a3ec470eedf73f8401d945d",
                "sha256": "39beb76d1b61e34492a1cdb3733e72b6b1b381b19883230b6c337201da5c2341"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "35562f344a3ec470eedf73f8401d945d",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1337137,
            "upload_time": "2024-04-15T06:08:38",
            "upload_time_iso_8601": "2024-04-15T06:08:38.769101Z",
            "url": "https://files.pythonhosted.org/packages/16/12/0fcda593abc38f2ae79187a4ab635d78d739783fac3db4585c2d3dc0394e/ucall-0.5.4-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2ab239efa711ab3ef61c7f3f90882aa1bc2ce9c8e9161ac572f81c0ae441ab09",
                "md5": "976d5d33aa91b4e9a20e253db76a8f2b",
                "sha256": "99dec59f7406ca53e33cf70a8f8b1e02c1aad323b6934149d7195772ac2a252b"
            },
            "downloads": -1,
            "filename": "ucall-0.5.4-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "976d5d33aa91b4e9a20e253db76a8f2b",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1371766,
            "upload_time": "2024-04-15T06:08:40",
            "upload_time_iso_8601": "2024-04-15T06:08:40.071684Z",
            "url": "https://files.pythonhosted.org/packages/2a/b2/39efa711ab3ef61c7f3f90882aa1bc2ce9c8e9161ac572f81c0ae441ab09/ucall-0.5.4-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-15 06:07:54",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "unum-cloud",
    "github_project": "ucall",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "ucall"
}
        
Elapsed time: 0.27815s