xoscar


Namexoscar JSON
Version 0.3.0 PyPI version JSON
download
home_pagehttp://github.com/xorbitsai/xoscar
SummaryPython actor framework for heterogeneous computing.
upload_time2024-03-14 10:55:24
maintainerQin Xuye
docs_urlNone
authorQin Xuye
requires_python
licenseApache License 2.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">
  <img width="77%" alt="" src="https://raw.githubusercontent.com/xprobe-inc/xoscar/main/doc/source/_static/Xoscar.svg"><br>
</div>

# Python actor framework for heterogeneous computing.
[![PyPI Latest Release](https://img.shields.io/pypi/v/xoscar.svg?style=for-the-badge)](https://pypi.org/project/xoscar/)
[![Coverage](https://img.shields.io/codecov/c/github/xorbitsai/xoscar?style=for-the-badge)](https://codecov.io/gh/xorbitsai/xoscar)
[![Build Status](https://img.shields.io/github/actions/workflow/status/xorbitsai/xoscar/python.yaml?branch=main&style=for-the-badge&label=GITHUB%20ACTIONS&logo=github)](https://actions-badge.atrox.dev/xorbitsai/xoscar/goto?ref=main)
[![License](https://img.shields.io/pypi/l/xoscar.svg?style=for-the-badge)](https://github.com/xorbitsai/xoscar/blob/main/LICENSE)

## What is actor
Writing parallel and distributed programs is often challenging and requires a lot of time to deal with concurrency
issues. Actor model provides a high-level, scalable and robust abstraction for building distributed applications. 
It provides several benefits:
- Scalability: Actors easily scale across nodes. The asynchronous, non-blocking nature of actors allows them to handle huge volumes of concurrent tasks efficiently.
- Concurrency: The actor model abstracts over concurrency, allowing developers to avoid raw threads and locks.
- Modularity: An actor system decomposes naturally into a collection of actors that can be understood independently. Actor logic is encapsulated within the actor itself.

## Why Xoscar
Xoscar implements the actor model in Python and provides user-friendly APIs that offer significant benefits for building 
applications on heterogeneous hardware:
- **Abstraction over low-level communication details**: Xoscar handles all communication between actors transparently,
whether on CPUs, GPUs, or across nodes. Developers focus on application logic rather than managing hardware resources 
and optimizing data transfer.
- **Flexible actor models**: Xoscar supports both stateful and stateless actors. Stateful actors ensure thread safety for 
concurrent systems while stateless actors can handle massive volumes of concurrent messages. Developers choose the 
appropriate actor model for their needs.
- **Batch method**: Xoscar provides a batch interface to significantly improve call efficiency when an actor interface is 
invoked a large number of times.
- **Advanced debugging support**: Xoscar can detect potential issues like deadlocks, long-running calls, and performance
bottlenecks that would otherwise be nearly impossible to troubleshoot in a heterogeneous environment.
- **Automated recovery**: If an actor fails for any reason, Xoscar will automatically restart it if you want. It can monitor 
actors and restart them upon failure, enabling fault-tolerant systems.

## Overview
![architecture.png](doc/source/_static/architecture.png)
Xoscar allows you to create multiple actor pools on each worker node, typically binding an actor pool to a CPU core or 
a GPU card. Xoscar provides allocation policies so that whenever an actor is created, it will be instantiated in the
appropriate pool based on the specified policy.

When actors communicate, Xoscar will choose the optimal communication mechanism based on which pools the actors 
belong to. This allows Xoscar to optimize communication in heterogeneous environments with multiple processing 
units and accelerators.

## Where to get it

### PyPI
Binary installers for the latest released version are available at the [Python
Package Index (PyPI)](https://pypi.org/project/xoscar).

```shell
# PyPI
pip install xoscar
```

### Build from source
The source code is currently hosted on GitHub at: https://github.com/xorbitsai/xoscar .

Building from source requires that you have cmake and gcc installed on your system.

- cmake >= 3.11
- gcc >= 8

```shell
# If you have never cloned xoscar before
git clone --recursive https://github.com/xorbitsai/xoscar.git
cd xoscar/python
pip install -e .

# If you have already cloned xoscar before
cd xoscar
git submodule init
git submodule update
cd python && pip install -e .
```

## APIs
Here are basic APIs for Xoscar.
#### Define an actor
```python
import xoscar as xo

# stateful actor, for stateless actor, inherit from xo.StatelessActor
class MyActor(xo.Actor):
    def __init__(self, *args, **kwargs):
        pass

    async def __post_create__(self):
        # called after created
        pass

    async def __pre_destroy__(self):
        # called before destroy
        pass

    def method_a(self, arg_1, arg_2, **kw_1):  # user-defined function
        pass

    async def method_b(self, arg_1, arg_2, **kw_1):  # user-defined async function
        pass
```

#### Create an actor
```python
import xoscar as xo

actor_ref = await xo.create_actor(
    MyActor, 1, 2, a=1, b=2,
    address='<ip>:<port>', uid='UniqueActorName')
```

#### Get an actor reference
```python
import xoscar as xo

actor_ref = await xo.actor_ref(address, actor_id)
```

#### Invoke a method
```python
# send
await actor_ref.method_a.send(1, 2, a=1, b=2)
# equivalent to actor_ref.method_a.send
await actor_ref.method_a(1, 2, a=1, b=2)
# tell, it sends a message asynchronously and does not wait for a response.
await actor_ref.method_a.tell(1, 2, a=1, b=2)
```
### Batch method
Xoscar provides a set of APIs to write batch methods. You can simply add a `@extensible` decorator to your actor method
and create a batch version. All calls wrapped in a batch will be sent together, reducing possible RPC cost.
#### Define a batch method
```python
import xoscar as xo

class ExampleActor(xo.Actor):
    @xo.extensible
    async def batch_method(self, a, b=None):
        pass
```
Xoscar also supports creating a batch version of the method:
```python
class ExampleActor(xo.Actor):
    @xo.extensible
    async def batch_method(self, a, b=None):
        raise NotImplementedError  # this will redirect all requests to the batch version

    @batch_method.batch
    async def batch_method(self, args_list, kwargs_list):
        results = []
        for args, kwargs in zip(args_list, kwargs_list):
            a, b = self.batch_method.bind(*args, **kwargs)
            # process the request
            results.append(result)
        return results  # return a list of results
```
In a batch method, users can define how to more efficiently process a batch of requests.

#### Invoke a batch method
Calling batch methods is easy. You can use `<method_name>.delay` to make a batched call and use `<method_name>.batch` to send them:
```python
ref = await xo.actor_ref(uid='ExampleActor', address='127.0.0.1:13425')
results = await ref.batch_method.batch(
    ref.batch_method.delay(10, b=20),
    ref.batch_method.delay(20),
)
```

## License
[Apache 2](LICENSE)

            

Raw data

            {
    "_id": null,
    "home_page": "http://github.com/xorbitsai/xoscar",
    "name": "xoscar",
    "maintainer": "Qin Xuye",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "qinxuye@xprobe.io",
    "keywords": "",
    "author": "Qin Xuye",
    "author_email": "qinxuye@xprobe.io",
    "download_url": "https://files.pythonhosted.org/packages/20/6b/9e69ae616a7ff042bef159c6e9ed5b9ddb99c0eb203d2366a0bf95328fa2/xoscar-0.3.0.tar.gz",
    "platform": null,
    "description": "<div align=\"center\">\n  <img width=\"77%\" alt=\"\" src=\"https://raw.githubusercontent.com/xprobe-inc/xoscar/main/doc/source/_static/Xoscar.svg\"><br>\n</div>\n\n# Python actor framework for heterogeneous computing.\n[![PyPI Latest Release](https://img.shields.io/pypi/v/xoscar.svg?style=for-the-badge)](https://pypi.org/project/xoscar/)\n[![Coverage](https://img.shields.io/codecov/c/github/xorbitsai/xoscar?style=for-the-badge)](https://codecov.io/gh/xorbitsai/xoscar)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/xorbitsai/xoscar/python.yaml?branch=main&style=for-the-badge&label=GITHUB%20ACTIONS&logo=github)](https://actions-badge.atrox.dev/xorbitsai/xoscar/goto?ref=main)\n[![License](https://img.shields.io/pypi/l/xoscar.svg?style=for-the-badge)](https://github.com/xorbitsai/xoscar/blob/main/LICENSE)\n\n## What is actor\nWriting parallel and distributed programs is often challenging and requires a lot of time to deal with concurrency\nissues. Actor model provides a high-level, scalable and robust abstraction for building distributed applications. \nIt provides several benefits:\n- Scalability: Actors easily scale across nodes. The asynchronous, non-blocking nature of actors allows them to handle huge volumes of concurrent tasks efficiently.\n- Concurrency: The actor model abstracts over concurrency, allowing developers to avoid raw threads and locks.\n- Modularity: An actor system decomposes naturally into a collection of actors that can be understood independently. Actor logic is encapsulated within the actor itself.\n\n## Why Xoscar\nXoscar implements the actor model in Python and provides user-friendly APIs that offer significant benefits for building \napplications on heterogeneous hardware:\n- **Abstraction over low-level communication details**: Xoscar handles all communication between actors transparently,\nwhether on CPUs, GPUs, or across nodes. Developers focus on application logic rather than managing hardware resources \nand optimizing data transfer.\n- **Flexible actor models**: Xoscar supports both stateful and stateless actors. Stateful actors ensure thread safety for \nconcurrent systems while stateless actors can handle massive volumes of concurrent messages. Developers choose the \nappropriate actor model for their needs.\n- **Batch method**: Xoscar provides a batch interface to significantly improve call efficiency when an actor interface is \ninvoked a large number of times.\n- **Advanced debugging support**: Xoscar can detect potential issues like deadlocks, long-running calls, and performance\nbottlenecks that would otherwise be nearly impossible to troubleshoot in a heterogeneous environment.\n- **Automated recovery**: If an actor fails for any reason, Xoscar will automatically restart it if you want. It can monitor \nactors and restart them upon failure, enabling fault-tolerant systems.\n\n## Overview\n![architecture.png](doc/source/_static/architecture.png)\nXoscar allows you to create multiple actor pools on each worker node, typically binding an actor pool to a CPU core or \na GPU card. Xoscar provides allocation policies so that whenever an actor is created, it will be instantiated in the\nappropriate pool based on the specified policy.\n\nWhen actors communicate, Xoscar will choose the optimal communication mechanism based on which pools the actors \nbelong to. This allows Xoscar to optimize communication in heterogeneous environments with multiple processing \nunits and accelerators.\n\n## Where to get it\n\n### PyPI\nBinary installers for the latest released version are available at the [Python\nPackage Index (PyPI)](https://pypi.org/project/xoscar).\n\n```shell\n# PyPI\npip install xoscar\n```\n\n### Build from source\nThe source code is currently hosted on GitHub at: https://github.com/xorbitsai/xoscar .\n\nBuilding from source requires that you have cmake and gcc installed on your system.\n\n- cmake >= 3.11\n- gcc >= 8\n\n```shell\n# If you have never cloned xoscar before\ngit clone --recursive https://github.com/xorbitsai/xoscar.git\ncd xoscar/python\npip install -e .\n\n# If you have already cloned xoscar before\ncd xoscar\ngit submodule init\ngit submodule update\ncd python && pip install -e .\n```\n\n## APIs\nHere are basic APIs for Xoscar.\n#### Define an actor\n```python\nimport xoscar as xo\n\n# stateful actor, for stateless actor, inherit from xo.StatelessActor\nclass MyActor(xo.Actor):\n    def __init__(self, *args, **kwargs):\n        pass\n\n    async def __post_create__(self):\n        # called after created\n        pass\n\n    async def __pre_destroy__(self):\n        # called before destroy\n        pass\n\n    def method_a(self, arg_1, arg_2, **kw_1):  # user-defined function\n        pass\n\n    async def method_b(self, arg_1, arg_2, **kw_1):  # user-defined async function\n        pass\n```\n\n#### Create an actor\n```python\nimport xoscar as xo\n\nactor_ref = await xo.create_actor(\n    MyActor, 1, 2, a=1, b=2,\n    address='<ip>:<port>', uid='UniqueActorName')\n```\n\n#### Get an actor reference\n```python\nimport xoscar as xo\n\nactor_ref = await xo.actor_ref(address, actor_id)\n```\n\n#### Invoke a method\n```python\n# send\nawait actor_ref.method_a.send(1, 2, a=1, b=2)\n# equivalent to actor_ref.method_a.send\nawait actor_ref.method_a(1, 2, a=1, b=2)\n# tell, it sends a message asynchronously and does not wait for a response.\nawait actor_ref.method_a.tell(1, 2, a=1, b=2)\n```\n### Batch method\nXoscar provides a set of APIs to write batch methods. You can simply add a `@extensible` decorator to your actor method\nand create a batch version. All calls wrapped in a batch will be sent together, reducing possible RPC cost.\n#### Define a batch method\n```python\nimport xoscar as xo\n\nclass ExampleActor(xo.Actor):\n    @xo.extensible\n    async def batch_method(self, a, b=None):\n        pass\n```\nXoscar also supports creating a batch version of the method:\n```python\nclass ExampleActor(xo.Actor):\n    @xo.extensible\n    async def batch_method(self, a, b=None):\n        raise NotImplementedError  # this will redirect all requests to the batch version\n\n    @batch_method.batch\n    async def batch_method(self, args_list, kwargs_list):\n        results = []\n        for args, kwargs in zip(args_list, kwargs_list):\n            a, b = self.batch_method.bind(*args, **kwargs)\n            # process the request\n            results.append(result)\n        return results  # return a list of results\n```\nIn a batch method, users can define how to more efficiently process a batch of requests.\n\n#### Invoke a batch method\nCalling batch methods is easy. You can use `<method_name>.delay` to make a batched call and use `<method_name>.batch` to send them:\n```python\nref = await xo.actor_ref(uid='ExampleActor', address='127.0.0.1:13425')\nresults = await ref.batch_method.batch(\n    ref.batch_method.delay(10, b=20),\n    ref.batch_method.delay(20),\n)\n```\n\n## License\n[Apache 2](LICENSE)\n",
    "bugtrack_url": null,
    "license": "Apache License 2.0",
    "summary": "Python actor framework for heterogeneous computing.",
    "version": "0.3.0",
    "project_urls": {
        "Homepage": "http://github.com/xorbitsai/xoscar"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d46338c4d430fe9330f5106f0c93b3fff76e9e96d0e26f3ffcbf71a2a8602691",
                "md5": "5881699514f225945125053a3000b8bf",
                "sha256": "88cba411df1db367070904b9ac88ab38a1fe771464d529215988f2310698d735"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp310-cp310-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "5881699514f225945125053a3000b8bf",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 2105161,
            "upload_time": "2024-03-14T10:54:48",
            "upload_time_iso_8601": "2024-03-14T10:54:48.477909Z",
            "url": "https://files.pythonhosted.org/packages/d4/63/38c4d430fe9330f5106f0c93b3fff76e9e96d0e26f3ffcbf71a2a8602691/xoscar-0.3.0-cp310-cp310-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "55ca7245e1b9a820988741cffba27694892d0ffcb6daa759cd2778eb66fd3fb3",
                "md5": "56a1c82e8b4a8429f183abab077b2cd3",
                "sha256": "a202e1d22860bdf97f518f5278338dc15bef26a30bb7ecad5d98d53efd8a5318"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "56a1c82e8b4a8429f183abab077b2cd3",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 1206141,
            "upload_time": "2024-03-14T10:54:50",
            "upload_time_iso_8601": "2024-03-14T10:54:50.824650Z",
            "url": "https://files.pythonhosted.org/packages/55/ca/7245e1b9a820988741cffba27694892d0ffcb6daa759cd2778eb66fd3fb3/xoscar-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "91b7e2eaa132810fbd1418e6a5209004a22fee25c399875126e14ce30f301c09",
                "md5": "a60d15a9d207f4f6698048ac9f5bde88",
                "sha256": "9217e988c558673b6af3df9084ed60854dd91cbc4e409e960d338025bd2474be"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "a60d15a9d207f4f6698048ac9f5bde88",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 3996431,
            "upload_time": "2024-03-14T10:54:52",
            "upload_time_iso_8601": "2024-03-14T10:54:52.796322Z",
            "url": "https://files.pythonhosted.org/packages/91/b7/e2eaa132810fbd1418e6a5209004a22fee25c399875126e14ce30f301c09/xoscar-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b02e1f44131061fd26174a1d52c7c0255a7d24be077144b834f9c7191f790ce2",
                "md5": "2a3a37263712358e24bbcd1de4dd89e0",
                "sha256": "d57a4042aed97b33cb7c7d0b5d20ecda60c84a8b005123e4d11eed508d459890"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2a3a37263712358e24bbcd1de4dd89e0",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 4058441,
            "upload_time": "2024-03-14T10:54:54",
            "upload_time_iso_8601": "2024-03-14T10:54:54.284602Z",
            "url": "https://files.pythonhosted.org/packages/b0/2e/1f44131061fd26174a1d52c7c0255a7d24be077144b834f9c7191f790ce2/xoscar-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d56ca073d6a530c0fe449146de918593c7a6350851bd97267875e530edf12645",
                "md5": "ea2f1f0a50bc46e6440a145f61e00d1b",
                "sha256": "0097b762e752dee5bf74b6724a57aa5bd2534e1f63195f42082e2ba5b80ac094"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ea2f1f0a50bc46e6440a145f61e00d1b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 1108036,
            "upload_time": "2024-03-14T10:54:55",
            "upload_time_iso_8601": "2024-03-14T10:54:55.772064Z",
            "url": "https://files.pythonhosted.org/packages/d5/6c/a073d6a530c0fe449146de918593c7a6350851bd97267875e530edf12645/xoscar-0.3.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a37b993b487b53f201bf12b11754ec7fd043aa776b8ac9334587931f468a7d3d",
                "md5": "e543cf5cbd9fa4b50432cc0a25be83e9",
                "sha256": "78d7788b332e751cba7bb47ec5254be308f0b825ce4abd2ff7de5f5aa6710739"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp311-cp311-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "e543cf5cbd9fa4b50432cc0a25be83e9",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 2093949,
            "upload_time": "2024-03-14T10:54:57",
            "upload_time_iso_8601": "2024-03-14T10:54:57.055155Z",
            "url": "https://files.pythonhosted.org/packages/a3/7b/993b487b53f201bf12b11754ec7fd043aa776b8ac9334587931f468a7d3d/xoscar-0.3.0-cp311-cp311-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c9ee61b808a7c03de16abd92947cf8b7326d336dbb5e1434227120d22686eafc",
                "md5": "184a7d2e653fb3061617527669cd95b0",
                "sha256": "cd5b16a6e0436c2d2e348b8e68376851f7042d4f868c3ed0536a31d9de04387e"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "184a7d2e653fb3061617527669cd95b0",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 1198596,
            "upload_time": "2024-03-14T10:54:58",
            "upload_time_iso_8601": "2024-03-14T10:54:58.430442Z",
            "url": "https://files.pythonhosted.org/packages/c9/ee/61b808a7c03de16abd92947cf8b7326d336dbb5e1434227120d22686eafc/xoscar-0.3.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ab6a7bb79e6ba1d539e8ac7b1e257525ae8c7afb02d60ebd207402ddef77af4e",
                "md5": "d346ddfa2249b078e65909c8ed90a435",
                "sha256": "38a9e013a8e9f4c9b9197a24f7e9a99817e82124a6aa1d7e57d577476b4c0296"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "d346ddfa2249b078e65909c8ed90a435",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 4250389,
            "upload_time": "2024-03-14T10:55:00",
            "upload_time_iso_8601": "2024-03-14T10:55:00.347688Z",
            "url": "https://files.pythonhosted.org/packages/ab/6a/7bb79e6ba1d539e8ac7b1e257525ae8c7afb02d60ebd207402ddef77af4e/xoscar-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8e0640593e95d52ca84e6abd428d8a53ffec0447ce13c621507d06d3b9eacbca",
                "md5": "9e6c20824671798eb84cfe8c48b389e5",
                "sha256": "4c39bab7623222061203cee9853c8267b69b5c1838eef10b50485bdacc76ad48"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9e6c20824671798eb84cfe8c48b389e5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 4296192,
            "upload_time": "2024-03-14T10:55:02",
            "upload_time_iso_8601": "2024-03-14T10:55:02.553963Z",
            "url": "https://files.pythonhosted.org/packages/8e/06/40593e95d52ca84e6abd428d8a53ffec0447ce13c621507d06d3b9eacbca/xoscar-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "51b40f342feb15a8522979917a4e5b25e3e3c9127d6fd8d83e350f081fab0c0d",
                "md5": "adf6e86a098f9b48bffdd3760cfd0fb5",
                "sha256": "b84c66d6a9ca220835df4c342fc299a8acf08b5d92c3147bf0df90a9f927f175"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "adf6e86a098f9b48bffdd3760cfd0fb5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 1096353,
            "upload_time": "2024-03-14T10:55:04",
            "upload_time_iso_8601": "2024-03-14T10:55:04.762217Z",
            "url": "https://files.pythonhosted.org/packages/51/b4/0f342feb15a8522979917a4e5b25e3e3c9127d6fd8d83e350f081fab0c0d/xoscar-0.3.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8045927a60a9c69dfbe6c13b7df8d13184c8b34a21aed6dde70870d84a9da71d",
                "md5": "7d590785e05d43bebe2370b29a41687e",
                "sha256": "b9c187509e74d8af4425d84e45b0b5c7cacf7d875d651448ba995cccb06aca21"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp38-cp38-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "7d590785e05d43bebe2370b29a41687e",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 2107853,
            "upload_time": "2024-03-14T10:55:06",
            "upload_time_iso_8601": "2024-03-14T10:55:06.718685Z",
            "url": "https://files.pythonhosted.org/packages/80/45/927a60a9c69dfbe6c13b7df8d13184c8b34a21aed6dde70870d84a9da71d/xoscar-0.3.0-cp38-cp38-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "029f41faa4d09904a0f816ce53bc47fb2f8a394e4de4a85c238ee35742144bec",
                "md5": "092320029be1607cd0956947a4acf39f",
                "sha256": "b2ac924cfff3cc58d78c40ef232640b54ba711842163c8b0a7a4b438e39ae710"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "092320029be1607cd0956947a4acf39f",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 1207136,
            "upload_time": "2024-03-14T10:55:08",
            "upload_time_iso_8601": "2024-03-14T10:55:08.330806Z",
            "url": "https://files.pythonhosted.org/packages/02/9f/41faa4d09904a0f816ce53bc47fb2f8a394e4de4a85c238ee35742144bec/xoscar-0.3.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7df5463f829605f34f07d39523f5fa5e40551920a08104f2ac17f5ac02a8aabc",
                "md5": "c1016787987863bb650b2629f2bf31b7",
                "sha256": "8466c1e0d36cac36302335449b1ff55b8fc5025343f059ba86e6bd2125692aad"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "c1016787987863bb650b2629f2bf31b7",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 4068668,
            "upload_time": "2024-03-14T10:55:09",
            "upload_time_iso_8601": "2024-03-14T10:55:09.738640Z",
            "url": "https://files.pythonhosted.org/packages/7d/f5/463f829605f34f07d39523f5fa5e40551920a08104f2ac17f5ac02a8aabc/xoscar-0.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "64edf41f4cfcaf3f3dd0000ec121e9ef2f2d07864417291e18078bce99b48c0a",
                "md5": "2349bd791b74e7267563edcbee9c07c2",
                "sha256": "4ab1d082bdb998a1e90a73426186ba1f2539ea9a90ffa96d6ff015cbd0598e0a"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2349bd791b74e7267563edcbee9c07c2",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 4128021,
            "upload_time": "2024-03-14T10:55:11",
            "upload_time_iso_8601": "2024-03-14T10:55:11.981419Z",
            "url": "https://files.pythonhosted.org/packages/64/ed/f41f4cfcaf3f3dd0000ec121e9ef2f2d07864417291e18078bce99b48c0a/xoscar-0.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eeb507ec3f911951a85cdc674c3d3c0a9654a41a1d7f3c9f3c2b2443b484eaf2",
                "md5": "c31b611cc7a58b0f0412e26f6acb816b",
                "sha256": "f444f12c77a690041e34e9f4c718e1524a104d41b95c4de171349de918f02e71"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c31b611cc7a58b0f0412e26f6acb816b",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 1113010,
            "upload_time": "2024-03-14T10:55:13",
            "upload_time_iso_8601": "2024-03-14T10:55:13.477317Z",
            "url": "https://files.pythonhosted.org/packages/ee/b5/07ec3f911951a85cdc674c3d3c0a9654a41a1d7f3c9f3c2b2443b484eaf2/xoscar-0.3.0-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dadc3aa1551bd3eec5d555827eb13f913c54c0ab7968ffdefa0ed34ef70c0c4e",
                "md5": "de9f0b143cb8779e7b66926d932dec9f",
                "sha256": "d83f4477fad6ddfc001e582e698c46542957fdfb85179f41f31a9d1b1183201a"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp39-cp39-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "de9f0b143cb8779e7b66926d932dec9f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 2110060,
            "upload_time": "2024-03-14T10:55:15",
            "upload_time_iso_8601": "2024-03-14T10:55:15.280860Z",
            "url": "https://files.pythonhosted.org/packages/da/dc/3aa1551bd3eec5d555827eb13f913c54c0ab7968ffdefa0ed34ef70c0c4e/xoscar-0.3.0-cp39-cp39-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b46aa8f9b7e4bbafb3e8482c4b760eff6e6e587d3eff9a8871be4110bb170ccd",
                "md5": "412f17473fb8d7d17d1ec3eda0261da3",
                "sha256": "93629a46428671bcb16c9668627b338fb8a6e2d52dd834ae75f306efa83ef6b6"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "412f17473fb8d7d17d1ec3eda0261da3",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 1208927,
            "upload_time": "2024-03-14T10:55:16",
            "upload_time_iso_8601": "2024-03-14T10:55:16.722732Z",
            "url": "https://files.pythonhosted.org/packages/b4/6a/a8f9b7e4bbafb3e8482c4b760eff6e6e587d3eff9a8871be4110bb170ccd/xoscar-0.3.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a6c7a963125394dbb05487f444e3b222250ddc1097a0eb9d3dcd2bd0b83f1554",
                "md5": "762ec96ed61e67c6a8762cddc23cd3db",
                "sha256": "39df0d540f2646c2d2531086e34bf9b671b171251777c8062127b468593af27c"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "762ec96ed61e67c6a8762cddc23cd3db",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 4002075,
            "upload_time": "2024-03-14T10:55:18",
            "upload_time_iso_8601": "2024-03-14T10:55:18.339466Z",
            "url": "https://files.pythonhosted.org/packages/a6/c7/a963125394dbb05487f444e3b222250ddc1097a0eb9d3dcd2bd0b83f1554/xoscar-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "37031fec76f615f9149c492287cb9b1e29e050210568a5dbff23cc03e1724de8",
                "md5": "7882deb4c68024f99290b99501844acd",
                "sha256": "83e0a389d6dc9dd7f9badec2b6b702b9b2b432055c3c79af03eddcf31bd3c6d9"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7882deb4c68024f99290b99501844acd",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 4063721,
            "upload_time": "2024-03-14T10:55:20",
            "upload_time_iso_8601": "2024-03-14T10:55:20.280630Z",
            "url": "https://files.pythonhosted.org/packages/37/03/1fec76f615f9149c492287cb9b1e29e050210568a5dbff23cc03e1724de8/xoscar-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0dce9d27e65cf79eabc7c01422fb04ce7491a9d97d2b41580e1add43b46b692d",
                "md5": "bb9a8e8853b4600050297d2f44b10d6b",
                "sha256": "3f2c5e254b6cc80248b1a3aafdcf1058169ea5787cd3a46d011a0c53491a12c2"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "bb9a8e8853b4600050297d2f44b10d6b",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 1100236,
            "upload_time": "2024-03-14T10:55:22",
            "upload_time_iso_8601": "2024-03-14T10:55:22.779468Z",
            "url": "https://files.pythonhosted.org/packages/0d/ce/9d27e65cf79eabc7c01422fb04ce7491a9d97d2b41580e1add43b46b692d/xoscar-0.3.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "206b9e69ae616a7ff042bef159c6e9ed5b9ddb99c0eb203d2366a0bf95328fa2",
                "md5": "84e9c33d770af75f9f719015053630ec",
                "sha256": "aa04b6d3bbd470a8c9fe98704a636e7614c0b4d0f462470c0ba355f4193da8cf"
            },
            "downloads": -1,
            "filename": "xoscar-0.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "84e9c33d770af75f9f719015053630ec",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 125995,
            "upload_time": "2024-03-14T10:55:24",
            "upload_time_iso_8601": "2024-03-14T10:55:24.736633Z",
            "url": "https://files.pythonhosted.org/packages/20/6b/9e69ae616a7ff042bef159c6e9ed5b9ddb99c0eb203d2366a0bf95328fa2/xoscar-0.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-14 10:55:24",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "xorbitsai",
    "github_project": "xoscar",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "xoscar"
}
        
Elapsed time: 0.27143s