# Parsl - a [[python|Python]] [[parallelism||parallel]] scripting library
[Parsl/parsl](https://github.com/Parsl/parsl)
> Parsl is a parallel programming library for Python. Parsl augments Python with
> simple, scalable, and flexible constructs for encoding parallelism. Developers
> **annotate** Python functions to specify opportunities for concurrent
> execution.
## Tutorial
[Parsl documentation](https://parsl.readthedocs.io/)
[Parsl/parsl-tutorial](https://github.com/Parsl/parsl-tutorial)
### Introduction
- Three types of apps: `@python_app` and `@bash_app`, and `@join_app`.
- Two types of futures: `AppFutures` and `DataFutures`.
- `output: list` and `input: list` to specify IO with `File` abstraction
A sample of local `HighThroughputExecutor` pool:
### Advanced features
- Multiple Sites
- Define multiple executors pool.
- Combine `label` and the `executors=[]` parameter in the decorator.
- Elasticity
- Specify the resources constraints in the config.
- Tweaking the `parallelism` parameter to favor reusing resources or
elastically growth.
- Fault tolerance and caching
- Caching results from completed apps, result is returned when same {function,
name, arguments, function body} are invoked.
- Incremental checkpointing saves state changes from previous checkpoint.
- [[globus|Globus]] data management
- Monitoring
- Optional module needed: `pip3 install parsl[monitoring]`
- Monitoring info stored in [[sqlite|SQLite]] database.
- Visualization of data and workflow
A sample multi-site configuration:
```python
multi_site_config = Config(
executors=[
ThreadPoolExecutor(
max_threads=8,
label='local_threads'
),
HighThroughputExecutor(
label="local_htex",
worker_debug=True,
max_workers=1,
provider=LocalProvider(
channel=LocalChannel(),
init_blocks=1,
max_blocks=1,
),
)
]
)
```
Configure [[python-decorator|decorators]] to use the pools:
```python
@bash_app(executors=["local_threads"])
```
## Issues faced in development
- ❗ Big problem: how to ensure the type checking?
## Detailed Discussion
- [[parsl-task-submission]]