import functools def force_async(fn): ''' turns a sync function to async function using threads ''' from concurrent.futures import ThreadPoolExecutor import asyncio pool = ThreadPoolExecutor() @functools.wraps(fn) def wrapper(*args, **kwargs): future = pool.submit(fn, *args, **kwargs) return asyncio.wrap_future(future) # make it awaitable return wrapper def force_sync(fn): ''' turn an async function to sync function ''' import asyncio @functools.wraps(fn) def wrapper(*args, **kwargs): res = fn(*args, **kwargs) if asyncio.iscoroutine(res): return asyncio.get_event_loop().run_until_complete(res) return res return wrapper