# Choose an execution style

The SDK exposes the same extraction and schema workflows in three execution styles. Choose based on connection lifetime and recovery needs, not on extraction semantics.

## Blocking

Use `extract()` or `schema()` for scripts, command-line jobs, and request handlers whose timeout comfortably exceeds workflow duration.

```python
from makra import Makra

with Makra() as client:
    response = client.extract(
        ["https://news.example/articles/memoization"],
        {"headline": "The article headline"},
    )
```

The connection stays open until a terminal result arrives. The default workflow timeout is 300 seconds per page budget. Sequential multi-URL calls and configured pagination increase the computed deadline when you do not pass an explicit timeout.

## Streaming

Use `extract_stream()` or `schema_stream()` when a user needs visible progress or your service wants live diagnostics. The stream carries events, not the final result payload. Read `event.run_id`, wait for a terminal event, then call `get_run_result()`.

Streaming can reconnect after a dropped connection when the server has assigned a run ID. The SDK resumes from the last event sequence within its retry budget.

## Deferred

Use `submit_extract()` or `submit_schema()` for queues, webhooks, background workers, and any process that may restart before the workflow finishes. Submission returns a handle immediately. The run and its stored result live on the service.

```python
from makra import Makra

with Makra() as client:
    run = client.submit_extract(
        ["https://shop.example/products/atlas-lamp"],
        {"price": "The current selling price"},
    )
    print(run.id)
```

Persist the run ID before doing more work. A different process can later call `get_run()`, `stream_run_events()`, `wait_for_run()`, or `get_run_result()`.

## Synchronous and asynchronous clients

`AsyncMakra` mirrors `Makra`. Ordinary methods are awaitable. Stream methods return async iterators.

```python
import asyncio

from makra import AsyncMakra


async def main() -> None:
    async with AsyncMakra() as client:
        response = await client.extract(
            ["https://news.example/articles/memoization"],
            {"headline": "The article headline"},
        )
        print(response)


asyncio.run(main())
```

Use the async client in an async application. Do not call the synchronous client directly from an event loop thread.

Next, [stream progress](/markdown/makra-sdk/v0.0.3-beta/features/stream-progress) or [manage deferred runs](/markdown/makra-sdk/v0.0.3-beta/features/manage-deferred-runs).
