« Back to Index

[Python Async Decorator]

View original Gist on GitHub

Tags: #python #asyncio #decorator

Python Async Decorator.py

import asyncio

from functools import wraps


def dec(fn):
    @wraps(fn)
    async def wrapper(*args, **kwargs):
        print(fn, args, kwargs)  # <function foo at 0x10952d598> () {}
        await asyncio.sleep(5)
        print("done with wrapper, going to call fn")
        return await fn()
    return wrapper
    
@dec
async def foo():
    return await asyncio.sleep(5, result="i'm done")
    
loop = asyncio.get_event_loop()
result = loop.run_until_complete(foo())  

print(result)  # i'm done

loop.close()

Python Async and Non-Async Decorator.py

import asyncio
import time

from functools import wraps


def dec(fn):
    if asyncio.iscoroutinefunction(fn):
        @wraps(fn)
        async def wrapper(*args, **kwargs):
            print(fn, args, kwargs)  # <function foo at 0x10952d598> () {}
            await asyncio.sleep(5)
            print("done with wrapper, going to call fn")
            return await fn()
        return wrapper
    else:
        @wraps(fn)
        def wrapper(*args, **kwargs):
            print(fn, args, kwargs)  # <function bar at 0x108fb5a60> () {}
            time.sleep(5)
            print("done with wrapper, going to call fn")
            return fn()
        return wrapper
    
@dec
async def foo():
    return await asyncio.sleep(5, result="async function done")
  
@dec
def bar():
    time.sleep(5)
    return "sync function done"
    
loop = asyncio.get_event_loop()
result = loop.run_until_complete(foo())  

print(result)  # async function done
print(bar())   # sync  function done

loop.close()

Python Decorator.py

import asyncio

from functools import wraps


async def foo():
    return await asyncio.sleep(5, result="i'm done")
    
loop = asyncio.get_event_loop()
result = loop.run_until_complete(foo())

print(result)  # i'm done

loop.close()