Asyncio Support

This sdk supports PEP 492 async/await functionality when running on python 3.5.3+ and installed with aio extras.

See the relevant installation section for details on how to install the sdk with aio extras.

The SDK will automatically detect if these conditions are met when imported, and an asyncio compatible dragonchain client can be created by awaiting dragonchain_sdk.create_aio_client with the same parameters as dragonchain_sdk.create_client.

Why Use Async/Await?

Python Async/Await is important for high performance with workloads that have lots of i/o, as it allows for concurrent code execution.

As communicating over a network is inherantly latent, you can regain performance for other parts of your application by allowing them to execute concurrently within an event loop while the dragonchain_sdk may be waiting on a result from a request to a chain.

For more information on asyncio, async/await, and the python event loop, read the Python Documentation.

Differences between the regular and async client

There are only a few notable differences between the regular and async client:

  1. The async client must be created by awaiting dragonchain_sdk.create_aio_client instead calling dragonchain_sdk.create_client (although they take identical parameters, so reference create_client for arguments)

  2. Each function on the client must be awaited

  3. When done using the client, its .close function should be awaited in order to clean up any persistent network connections. (This function only exists on async clients)

Other than that, everything else, including function arguments should be identical.

Usage Example

The following is a usage example for the async client: creating the client, making a request to a chain, then closing the client.

import asyncio

import dragonchain_sdk


async def main():
    # Create our client by awaiting the function
    my_client = await dragonchain_sdk.create_aio_client(
        dragonchain_id="c2dffKwiGj6AGg4zHkNswgEcyHeQaGr4Cm5SzsFVceVv",
        auth_key_id="JSDMWFUJDVTC",
        auth_key="n3hlldsFxFdP2De0yMu6A4MFRh1HGzFvn6rJ0ICZzkE",
        endpoint="https://35a7371c-a20a-4830-9a59-5d654fcd0a4a.api.dragonchain.com",
    )

    # Ensure to await all our calls on the client
    result = await my_client.get_status()

    # Handle the response identically to the regular client
    if result["ok"]:
        print("Successful call, here is the response from the chain:")
        print(result["response"])
    else:
        print("There was the following error making a call to the dragonchain:")
        print(result["response"])

    # Make sure to call .close on the client for cleanup when we're done
    await my_client.close()


if __name__ == "__main__":
    asyncio.get_event_loop().run_until_complete(main())