Skip to main content

Asynchronous RPC via UDP

Project description

RPCUDP : RPC over UDP in Python

Build Status

RPC over UDP may seem like a silly idea, but things like the DHT Kademlia require it. This project is specifically designed for asynchronous Python 3 code to accept and send remote proceedure calls.

Because of the use of UDP, you will not always know whether or not a procedure call was successfully received. This isn't considered an exception state in the library, though you will know if a response isn't received by the server in a configurable amount of time.

Installation

pip install rpcudp

Usage

This assumes you have a working familiarity with asyncio.

First, let's make a server that accepts a remote procedure call and spin it up.

import asyncio
from rpcudp.protocol import RPCProtocol

class RPCServer(RPCProtocol):
    # Any methods starting with "rpc_" are available to clients.
    def rpc_sayhi(self, sender, name):
        return "Hello %s you live at %s:%i" % (name, sender[0], sender[1])

    # You can also define a coroutine
    async def rpc_sayhi_slowly(self, sender, name):
        await some_awaitable()
        return "Hello %s you live at %s:%i" % (name, sender[0], sender[1])

async def main():
    loop = asyncio.get_event_loop()
    # start a server on UDP port 1234
    transport, protocol = await loop.create_datagram_endpoint(
        RPCServer, local_addr=("127.0.0.1", 1234)
    )

    # run indefinitely
    await asyncio.Event().wait()

asyncio.run(main())

Now, let's make a client script. Note that we do need to specify a port for the client as well, since it needs to listen for responses to RPC calls on a UDP port.

import asyncio
from rpcudp.protocol import RPCProtocol

async def sayhi(protocol, address):
    # result will be a tuple - first arg is a boolean indicating whether a response
    # was received, and the second argument is the response if one was received.
    result = await protocol.sayhi(address, "Snake Plissken")
    print(result[1] if result[0] else "No response received.")

async def main():
    loop = asyncio.get_event_loop()
    # Start local UDP server to be able to handle responses
    transport, protocol = await loop.create_datagram_endpoint(
        RPCProtocol, local_addr=("127.0.0.1", 4567)
    )

    # Call remote UDP server to say hi
    await sayhi(protocol, ("127.0.0.1", 1234))
    transport.close()

asyncio.run(main())

You can run this example in the examples folder (client.py and server.py).

Logging

This library uses the standard Python logging library. To see debut output printed to STDOUT, for instance, use:

import logging

log = logging.getLogger('rpcudp')
log.setLevel(logging.DEBUG)
log.addHandler(logging.StreamHandler())

Implementation Details

The protocol is designed to be as small and fast as possible. Python objects are serialized using MsgPack. All calls must fit within 8K (generally small enough to fit in one datagram packet).

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

rpcudp-5.0.1.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rpcudp-5.0.1-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file rpcudp-5.0.1.tar.gz.

File metadata

  • Download URL: rpcudp-5.0.1.tar.gz
  • Upload date:
  • Size: 8.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.10

File hashes

Hashes for rpcudp-5.0.1.tar.gz
Algorithm Hash digest
SHA256 b6793b9b3e84e9c8510fa78e259cc3204c1b03fd2bb4fbf0f457cd391933bb78
MD5 90263bbad99f87dfc46ab4986a12ca82
BLAKE2b-256 395b99ee4dd6080d857f029ad209860d461305f5fba9fef2316548a1d131e4c2

See more details on using hashes here.

File details

Details for the file rpcudp-5.0.1-py3-none-any.whl.

File metadata

  • Download URL: rpcudp-5.0.1-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.10

File hashes

Hashes for rpcudp-5.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8bf7cf1caed687acbbf2a37b67a92b02d109483a2da28fa13cca93b9ee873b9a
MD5 028db536c52295b28cf43de020959b28
BLAKE2b-256 058b33f35f2a730f848b5e5ac24dcb50c97387b98756e0f199ee8da30ef19fe7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page