Hi,
I was really struggling with concurrency in panel
because due to the nice learning curve, I have hardly any clue of the underlying machinery. Most examples were beyond my level of understanding. I like the param
class based approach. Hence here my Jupyter
based example:
class DataSource(param.Parameterized):
"""!
@brief Simulation of an external data source, e.g. measurement instrument, for parallel data acquisition.
"""
acquire = param.Boolean(default=True, doc="Data acquisition status")
run = param.Boolean(default=True, doc="Running status of async task")
counter = param.Integer(default=0, doc="Dummy data")
def __init__(self, **params):
super().__init__(**params)
# Necessary only if `Jupyter` is used. In Python: `asyncio.create_task(self._get_data())`
jupyter_loop = asyncio.get_running_loop()
jupyter_loop.create_task(self._get_data())
async def _get_data(self):
while self.run:
if self.acquire:
print(f"Data {self.counter}")
await asyncio.sleep(1)
self.counter += 1
else:
print(f"Waiting ...")
await asyncio.sleep(1)
data_source = DataSource()
Control with:
data_source.acquire = False # Wait for "data", then pause acquisition
data_source.acquire = True # Start again
data_source.run = False # End task
panel
version:
class DataSourcePn(DataSource):
def __init__(self, **params):
super().__init__(**params)
def dashboard(self):
return pn.panel(self.param)
DataSourcePn().dashboard()
Any feedback is welcome.
PS: I borrowed the title from a book by Neil deGrasse Tyson