Async-native Redis-backed RPC and job queue
Project description
Raddish
Raddish is mix of RPC and job queue backed by Redis. You can launch multiple servers that will accept the same function calls in a round-robin fashion. From the client side you can asynchronously submit jobs and block the execution until they are completed.
Getting started
- Implement a server
import asyncio
import logging
import os
from redis.asyncio import Redis
from rich.logging import RichHandler
from raddish import RaddishServer, AsyncWorker
logging.basicConfig(
level=logging.INFO,
format="%(message)s",
datefmt="[%X]",
handlers=[RichHandler(rich_tracebacks=True)],
)
logger = logging.getLogger("raddish-test")
class TestWorker(AsyncWorker):
async def setup(self) -> None:
logger.info("Setting up test worker")
async def __call__(self, input: dict[str, any]) -> dict[str, any]:
logger.info(f"Received input: {input}")
input: int = input["number"]
input += 1
await asyncio.sleep(10)
return {
"number": input,
}
async def main() -> None:
redis_client: Redis = Redis.from_url(
os.environ.get("REDIS_URL", "redis://localhost:6379")
)
server: RaddishServer = RaddishServer(redis_client)
server.add_worker("add_one", TestWorker())
await server.start()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
- Implement a client
import asyncio
import logging
import os
from redis.asyncio import Redis
from rich.logging import RichHandler
from raddish import AsyncRaddishClient
logging.basicConfig(
level=logging.INFO,
format="%(message)s",
datefmt="[%X]",
handlers=[RichHandler(rich_tracebacks=True)],
)
logger = logging.getLogger("raddish-test")
async def main() -> None:
redis_client: Redis = Redis.from_url(
os.environ.get("REDIS_URL", "redis://localhost:6379")
)
client: AsyncRaddishClient = AsyncRaddishClient(redis_client)
counter: int = 0
for _ in range(5):
logger.info(f"Sending input {counter}")
counter = (await client.call("add_one", {"number": counter}))["number"]
logger.info(f"Received output {counter}")
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
- Launch one or more servers
python server.py
- Launch one or more clients
python client.py
Features
- You can add servers at any time in order to increase capacity
- Asyncio-native
- Servers can be located anywhere where there is internet, no need to have public ip - you only need to be able to connect to the redis server
License
Raddish is licensed under Apache License, Version 2.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
raddish-0.2.3.tar.gz
(9.7 kB
view details)
Built Distribution
raddish-0.2.3-py3-none-any.whl
(11.5 kB
view details)
File details
Details for the file raddish-0.2.3.tar.gz
.
File metadata
- Download URL: raddish-0.2.3.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.18
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 54a0d085cbbae1cf037b792558f99f780eb71ed505c3b2af33f764d94a347b0b |
|
MD5 | c00b5883e3270a68746ad8c5c17b949a |
|
BLAKE2b-256 | 0178dd143c8d75f371da2911f1d3b457333740e7e5b25e516702e0fd6c9a91ef |
File details
Details for the file raddish-0.2.3-py3-none-any.whl
.
File metadata
- Download URL: raddish-0.2.3-py3-none-any.whl
- Upload date:
- Size: 11.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.18
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e33ac7eae1626e3c24b47b1a2d544e2795228f6af74c7a325b33d2bb814abcb6 |
|
MD5 | 2eff53452bb5de0cab9e8e97df823c25 |
|
BLAKE2b-256 | 42ae110b08bbc442bf0f95c48c8b9b5dfed5a34b7036933b6f903b4d23ba2520 |