jarpc 0.3.1

Creator: bradpython12

Last updated:

Add to Cart

Description:

jarpc 0.3.1

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.




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

Python >= 3.6
aioredis

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.

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.