def METHOD_NAME(self, method, action, data=None):
    """
    Executes a HTTP action asynchronously.
    Args:
        method: get or post
        action: url action to perform
        data: post parameters
    Returns:
        json results if any
    """
    # Get urls
    urls = [f"{shard}/{action}" for shard in self.shards]
    close = False
    # Use existing loop if available, otherwise create one
    try:
        loop = asyncio.get_event_loop()
    except RuntimeError:
        loop = asyncio.new_event_loop()
        close = True
    try:
        return loop.run_until_complete(self.run(urls, method, data))
    finally:
        # Close loop if it was created in this method
        if close:
            loop.close()