# Async Operations API

To maximize throughput in web servers (like FastAPI or Sanic) or concurrent environments, `pyopenxlsx` exposes `async` versions of all I/O-intensive and computationally heavy methods. They run in a threadpool executor under the hood, ensuring the main asyncio event loop is not blocked.

## Async Context Managers

```python
import asyncio
from pyopenxlsx import Workbook, load_workbook_async

async def process_file():
    # Loading asynchronously
    async with await load_workbook_async("data.xlsx") as wb:
        ws = wb.active
        
        # Read async
        val = await ws.get_cell_value_async(1, 1)
        
        # Write async
        await ws.set_cell_value_async(2, 1, "Updated")
        
        # Bulk write async
        await ws.write_rows_async(3, [[1, 2], [3, 4]])
        
        # Save async
        await wb.save_async("data_updated.xlsx")

asyncio.run(process_file())
```

## Available Async Methods

**Workbook:**
- `await load_workbook_async(filename)`
- `await wb.save_async()`
- `await wb.close_async()`
- `await wb.create_sheet_async(title)`
- `await wb.copy_worksheet_async(ws)`
- `await wb.remove_async(ws)`
- `await wb.add_style_async(...)`
- `await wb.extract_images_async(...)`

**Worksheet:**
- `await ws.append_async(data)`
- `await ws.write_row_async(row, data)`
- `await ws.write_rows_async(start_row, data)`
- `await ws.write_range_async(start_row, start_col, data)`
- `await ws.set_cells_async(cells_batch)`
- `await ws.get_cell_value_async(row, col)`
- `await ws.get_row_values_async(row)`
- `await ws.get_range_data_async(r1, c1, r2, c2)`
- `await ws.get_range_values_async(r1, c1, r2, c2)`
- `await ws.get_rows_data_async()`
- `await ws.merge_cells_async(ref)`
- `await ws.unmerge_cells_async(ref)`
- `await ws.protect_async(password)`
- `await ws.unprotect_async()`
- `await ws.add_image_async(path, anchor)`
