diff --git a/README.md b/README.md index 30ad7c6..89b116e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Features - Integrated web and RPC servers -- Automated task management +- [Automated task management with built-in start/stop controls and optional autostart](#understanding-tasks-in-pydase) - Event-based callback functionality for real-time updates - Built-in support for serving data over different protocols - Support for additional servers for specific use-cases @@ -103,9 +103,48 @@ Once the server is running, you can access the web interface in a browser: In this interface, you can interact with the properties of your `Device` service. +## Understanding Tasks in pydase + +In `pydase`, a task is defined as an asynchronous function contained in a class that inherits from `DataService`. These tasks usually contain a while loop and are designed to carry out periodic functions. + +For example, a task might be used to periodically read sensor data, update a database, or perform any other recurring job. The core feature of `pydase` is its ability to automatically generate start and stop functions for these tasks. This allows you to control task execution via both the frontend and an `rpyc` client, giving you flexible and powerful control over your service's operation. + +Another powerful feature of `pydase` is its ability to automatically start tasks upon initialization of the service. By specifying the tasks and their arguments in the `_autostart_tasks` dictionary in your service class's `__init__` method, `pydase` will automatically start these tasks when the server is started. Here's an example: + +```python +from pydase import DataService, Server + +class SensorService(DataService): + def __init__(self): + self.readout_frequency = 1.0 + self._autostart_tasks = {"read_sensor_data": ()} # args passed to the function go there + super().__init__() + + def _process_data(self, data: ...) -> None: + ... + + def _read_from_sensor(self) -> Any: + ... + + async def read_sensor_data(self): + while True: + data = self._read_from_sensor() + self._process_data(data) # Process the data as needed + await asyncio.sleep(self.readout_frequency) + + +if __name__ == "__main__": + service = SensorService() + Server(service).run() +``` + +In this example, `read_sensor_data` is a task that continuously reads data from a sensor. The readout frequency can be updated using the `readout_frequency` attribute. +By listing it in the `_autostart_tasks` dictionary, it will automatically start running when `Server(service).run()` is executed. +As with all tasks, `pydase` will also generate `start_read_sensor_data` and `stop_read_sensor_data` methods, which can be called to manually start and stop the data reading task. + ## Documentation -For more details about usage and features, see the [full documentation](URL_TO_YOUR_DOCUMENTATION). +The full documentation provides more detailed information about `pydase`, including advanced usage examples, API references, and tips for troubleshooting common issues. See the [full documentation](URL_TO_YOUR_DOCUMENTATION) for more information. ## Contributing