Skip to main content
Join the official 2019 Python Developers SurveyStart the survey!

RPC over redis communication library

Project description

jarpc

Warning: project is in early development stage, expect bugs and frequent breaking changes

jarpc - Just another python RPC library based on redis pubsub. It is built with aioredis.

Documentation Status Build Status codecov

Features

  • Client, Server and Slient connection modes.
Client Server Slient
Calling commands yes no yes
Receiving commands no yes yes
  • asyncronous response processing (AsyncIterator).
  • encoding customization (marshal (default), json, msgpack, pickle, ...).

Installation

Library can be installed from PyPi: pip install jarpc Or from repository: pip install git+https://github.com/IOMirea/jarpc.git#egg=jarpc

Examples

Client

import asyncio

from jarpc import Client

REDIS_HOST = "localhost"
REDIS_PORT = 6379

COMMAND_PING = 0
COMMAND_SLOW_PING = 1
COMMAND_FIX_BUGS = 42


async def main() -> None:
    client = Client("example", default_timeout=5, default_expect_responses=1)


    asyncio.create_task(client.start((REDIS_HOST, REDIS_PORT)))

    await client.wait_until_ready()

    ping_data = {"message": input("Enter message to send or leave blank: ")}

    print("PING      ->", await client.call(COMMAND_PING, ping_data))
    print("SLOW_PING ->", await client.call(COMMAND_SLOW_PING, timeout=1))
    print("FIX_BUGS  ->", await client.call(COMMAND_FIX_BUGS))

    # exit
    client.close()


if __name__ == "__main__":
    asyncio.run(main())

Server

import os
import asyncio

from jarpc import Server, Request

REDIS_HOST = "localhost"
REDIS_PORT = 6379

COMMAND_PING = 0
COMMAND_SLOW_PING = 1

server = Server("example", node=f"example-{os.getpid()}")


@server.command(COMMAND_PING)
async def ping(req: Request, message: str = "") -> str:
    """Responds with provided message argument or 'pong'."""

    print("Received PING command")

    return "pong" if message == "" else message


@server.command(COMMAND_SLOW_PING)
async def slow_ping(req: Request) -> str:
    """Responds with 'pong' after 2 seconds, too slow..."""

    print("Received SLOW_PING command")

    await asyncio.sleep(2)

    return "pong"


if __name__ == "__main__":
    server.run((REDIS_HOST, REDIS_PORT))

Slient

import os
import asyncio

from jarpc import Slient, Request

REDIS_HOST = "localhost"
REDIS_PORT = 6379

COMMAND_PING = 0

loop = asyncio.get_event_loop()

slient = Slient(
    "example",
    loop=loop,
    node=f"example-{os.getpid()}",
    default_timeout=5,
    default_expect_responses=1,
)


@slient.command(COMMAND_PING)
async def ping(req: Request, message: str = "") -> str:
    """Responds with provided message argument or 'pong'."""

    print("Received PING command")

    return "pong" if message == "" else message


async def call_ping(slient: Slient) -> None:
    await slient.wait_until_ready()

    print("PING ->", await slient.call(COMMAND_PING))


if __name__ == "__main__":
    loop.create_task(slient.start((REDIS_HOST, REDIS_PORT)))
    loop.create_task(call_ping(slient))

    # continue listening for commands
    loop.run_forever()

More examples can be found in examples folder.

Dependencies

Documentation

Documentation is available at https://jarpc.readthedocs.io

Source code

Source code is available on GitHub: https://github.com/IOMirea/jarpc

Protocol specification

Soon

Contributing

Feel free to open an issue or submit a pull request.

License

Source code is available under GPL v3.0 license, you can see it here.

Project details


Download files

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

Files for jarpc, version 0.3.1
Filename, size File type Python version Upload date Hashes
Filename, size jarpc-0.3.1-py3-none-any.whl (29.8 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size jarpc-0.3.1.tar.gz (9.6 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page