# Using IPython for parallel computing

> ```{eval-rst}
>
> :Release: |release|
> :Date: |today|
> ```

(install)=

## Installing IPython Parallel

As of 4.0, IPython parallel is now a standalone package called {mod}`ipyparallel`.
You can install it with:

```
pip install ipyparallel
```

or:

```
conda install ipyparallel
```

As of IPython Parallel 7,
this will include installing/enabling an extension for both the classic Jupyter Notebook
and JupyterLab ≥ 3.0.

## Quickstart

IPython Parallel

A quick example to:

1. allocate a cluster (collection of IPython engines for use in parallel)
2. run a collection of tasks on the cluster
3. wait interactively for results
4. cleanup resources after the task is done

```python
import time
import ipyparallel as ipp

task_durations = [1] * 25
# request a cluster
with ipp.Cluster() as rc:
    # get a view on the cluster
    view = rc.load_balanced_view()
    # submit the tasks
    asyncresult = view.map_async(time.sleep, task_durations)
    # wait interactively for results
    asyncresult.wait_interactive()
    # retrieve actual results
    result = asyncresult.get()
# at this point, the cluster processes have been shutdown
```


You can similarly run MPI code using IPyParallel (requires [mpi4py](https://mpi4py.readthedocs.io/en/stable/install.html)):

```python
import ipyparallel as ipp

def mpi_example():
    from mpi4py import MPI
    comm = MPI.COMM_WORLD
    return f"Hello World from rank {comm.Get_rank()}. total ranks={comm.Get_size()}"

# request an MPI cluster with 4 engines
with ipp.Cluster(engines='mpi', n=4) as rc:
    # get a broadcast_view on the cluster which is best
    # suited for MPI style computation
    view = rc.broadcast_view()
    # run the mpi_example function on all engines in parallel
    r = view.apply_sync(mpi_example)
    # Retrieve and print the result from the engines
    print("\n".join(r))
# at this point, the cluster processes have been shutdown
```

![IPyParallel-MPI-Example](./_static/IPyParallel-MPI-Example.png)

Follow the [tutorial][] to learn more.

[tutorial]: ./tutorial/index

## Contents

```{toctree}
:maxdepth: 2

tutorial/index
reference/index
```

```{toctree}
:maxdepth: 2

examples/index
```

```{toctree}
:maxdepth: 1

changelog
```

# IPython Parallel API

```{toctree}
:maxdepth: 2

api/ipyparallel.rst
```

# Indices and tables

- {ref}`genindex`
- {ref}`modindex`
- {ref}`search`
