Metadata-Version: 2.1
Name: aiorpc
Version: 0.1.7
Summary: A fast RPC library based on asyncio and MessagePack
Home-page: http://github.com/choleraehyq/aiorpc
Author: Cholerae Hu
Author-email: choleraehyq@gmail.com
License: WTFPL
Keywords: rpc,msgpack,messagepack,msgpackrpc,messagepackrpc,asyncio
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.5
Description-Content-Type: text/x-rst
Requires-Dist: msgpack
Requires-Dist: uvloop

aiorpc
======

.. image:: https://badge.fury.io/py/aiorpc.png
    :target: http://badge.fury.io/py/aiorpc

.. image:: https://travis-ci.org/choleraehyq/aiorpc.png?branch=master
    :target: https://travis-ci.org/choleraehyq/aiorpc

aiorpc is a lightweight asynchronous RPC library. It enables you to easily build a distributed server-side system by writing a small amount of code. It is built on top of `asyncio <https://docs.python.org/3/library/asyncio.html/>`_ and `MessagePack <http://msgpack.org/>`_.

**Note aiorpc is under development, should not be considered to have a stable API.**

Installation
------------

To install aiorpc, simply:

.. code-block:: bash

    $ pip install aiorpc

Examples
--------

RPC server
^^^^^^^^^^

.. code-block:: python

    from aiorpc import RPCServer

    import asyncio
    import uvloop


    def echo(msg):
        return msg

    rpc_server = RPCServer()
    loop = uvloop.new_event_loop()
    asyncio.set_event_loop(loop)
    rpc_server.register("echo", echo)
    coro = asyncio.start_server(rpc_server.serve, '127.0.0.1', 6000, loop=loop)
    server = loop.run_until_complete(coro)

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        server.close()
        loop.run_until_complete(server.wait_closed())

RPC client
^^^^^^^^^^

.. code-block:: python

    from aiorpc import RPCClient

    import asyncio
    import uvloop

    async def do(cli):
        ret = await client.call('echo', 'message')
        print("{}\n".format(ret))

    loop = uvloop.new_event_loop()
    asyncio.set_event_loop(loop)
    client = RPCClient('127.0.0.1', 6000)
    loop.run_until_complete(do(client))
    client.close()

aiorpc client can also be used as an async context manager:

.. code-block:: python

    async def do():
        async with RPCClient('127.0.0.1', 6000) as client:
            ret = await client.call('echo', 'message')
            print("{}\n".format(ret))



Performance
-----------

aiorpc with `uvloop <https://github.com/MagicStack/uvloop>`_ significantly outperforms `ZeroRPC <http://zerorpc.dotcloud.com/>`_ (**6x** faster), which is built using `ZeroMQ <http://zeromq.org/>`_ and `MessagePack <http://msgpack.org/>`_ and slightly underperforms `official MessagePack RPC <https://github.com/msgpack-rpc/msgpack-rpc-python>`_ (**0.7x** slower), which is built using `Facebook's Tornado <http://www.tornadoweb.org/en/stable/>`_ and `MessagePack <http://msgpack.org/>`_.

- aiorpc


.. code-block:: bash

    % python benchmarks/benchmark_aiorpc.py
    call: 2236 qps


- Official MesssagePack RPC

.. code-block:: bash

    % pip install msgpack-rpc-python
    % python benchmarks/benchmark_msgpackrpc.py
    call: 3112 qps

- ZeroRPC

.. code-block:: bash

    % pip install zerorpc
    % python benchmarks/benchmark_zerorpc.py
    call: 351 qps


Documentation
-------------

Documentation is available at http://aiorpc.readthedocs.org/.


