Only asynchronous (defined with async def) functions can be awaited. Whole idea is that such functions are written special way what makes possible to run (await) them without blocking event loop.
If you want to get result from common (defined with def) function that takes some considerable time to be executed you have these options:
- rewrite this whole function to be asynchronous
- call this function in another thread and await for result asynchronously
- call this function in another process and await for result asynchronously
Usually you want to choose second option.
Here’s example of how to do it:
import asyncio
import time
from concurrent.futures import ThreadPoolExecutor
_executor = ThreadPoolExecutor(1)
def sync_blocking():
time.sleep(2)
async def hello_world():
# run blocking function in another thread,
# and wait for it's result:
await loop.run_in_executor(_executor, sync_blocking)
loop = asyncio.get_event_loop()
loop.run_until_complete(hello_world())
loop.close()
Please, read this answer about how asyncio works. I think it’ll help you much.