Run synchronous functions asynchronously#
Running your bound, synchronous functions asynchronously can be an easy way to make your application responsive and scale to more users.
Asyncify#
This example will show how to make your app responsive by running a sync, cpu bound function asynchronously. We will be using asyncer by Tiangolo. You can install the package via pip install asyncer
.
import numpy as np
import pandas as pd
from asyncer import asyncify
import panel as pn
widget = pn.widgets.IntSlider(value=5, start=0, end=10)
def do_sync_work(it, n):
return sum(pd.DataFrame(np.random.rand(n,n)).sum().sum() for _ in range(it))
async def create_result():
yield pn.indicators.LoadingSpinner(value=True, width=25, height=25)
result = await asyncify(do_sync_work)(it=5, n=10000)
yield f"Wow. That was slow.\n\nThe sum is **{result:.2f}**"
pn.Column(widget.rx() + 1, create_result).servable()
Without asyncify
the app would have been unresponsive for 5-10 seconds while loading.
asyncify
works well for IO bound functions as well as for CPU bound functions that releases the GIL.
Dask#
If you run many cpu bound functions you may consider offloading your functions asynchronously to an external compute engine like Dask. See our Dask how-to Guide.