Source code for panel.pane.streamz
"""
Renders Streamz Stream objects.
"""
from __future__ import annotations
import sys
from typing import (
TYPE_CHECKING, Any, ClassVar, Mapping, Optional,
)
import param
from .base import ReplacementPane
if TYPE_CHECKING:
from bokeh.document import Document
from bokeh.model import Model
from pyviz_comms import Comm
[docs]class Streamz(ReplacementPane):
"""
The `Streamz` pane renders streamz `Stream` objects emitting arbitrary
objects, unlike the DataFrame pane which specifically handles streamz
DataFrame and Series objects and exposes various formatting objects.
Reference: https://panel.holoviz.org/reference/panes/Streamz.html
:Example:
>>> Streamz(some_streamz_stream_object, always_watch=True)
"""
always_watch = param.Boolean(default=False, doc="""
Whether to watch even when not displayed.""")
rate_limit = param.Number(default=0.1, bounds=(0, None), doc="""
The minimum interval between events.""")
_rename: ClassVar[Mapping[str, str | None]] = {'rate_limit': None, 'always_watch': None}
def __init__(self, object=None, **params):
super().__init__(object, **params)
self._stream = None
if self.always_watch:
self._setup_stream()
@param.depends('always_watch', 'object', 'rate_limit', watch=True)
def _setup_stream(self):
if self.object is None or (self.always_watch and self._stream):
return
elif self._stream:
self._stream.destroy()
self._stream = None
if self._pane._models or self.always_watch:
self._stream = self.object.latest().rate_limit(self.rate_limit).gather()
self._stream.sink(self._update_inner)
def _get_model(
self, doc: Document, root: Optional[Model] = None,
parent: Optional[Model] = None, comm: Optional[Comm] = None
) -> Model:
model = super()._get_model(doc, root, parent, comm)
self._setup_stream()
return model
def _cleanup(self, root: Model | None = None):
super()._cleanup(root)
if not self._pane._models and self._stream:
self._stream.destroy()
self._stream = None
#----------------------------------------------------------------
# Public API
#----------------------------------------------------------------
[docs] @classmethod
def applies(cls, obj: Any) -> float | bool | None:
if 'streamz' in sys.modules:
from streamz import Stream
return isinstance(obj, Stream)
return False