21 lines
642 B
Python
21 lines
642 B
Python
import asyncio
|
|
from functools import partial
|
|
from typing import Awaitable, Callable, TypeVar
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
def make_async(_func: Callable[..., T]) -> Callable[..., Awaitable[T]]:
|
|
"""Take a blocking function, and run it on in an executor thread.
|
|
|
|
This function prevents the blocking function from blocking the asyncio event loop.
|
|
The code in this function needs to be thread safe.
|
|
"""
|
|
|
|
def _async_wrapper(*args, **kwargs) -> asyncio.Future:
|
|
loop = asyncio.get_event_loop()
|
|
func = partial(_func, *args, **kwargs)
|
|
return loop.run_in_executor(executor=None, func=func)
|
|
|
|
return _async_wrapper
|