Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

awa-pg

Python bindings for awa, a Postgres-native background job queue. Same engine, same SQL, same defaults as the Rust core; native-speed dispatch via PyO3.

pip install awa-pg

Quick start

import asyncio
import os
from dataclasses import dataclass

from awa import AsyncClient


@dataclass
class SendEmail:
    to: str
    subject: str


async def main():
    client = AsyncClient(os.environ["DATABASE_URL"])

    @client.task(SendEmail, queue="email")
    async def send_email(job):
        print(f"sending to {job.args.to}: {job.args.subject}")

    await client.start([("email", 4)])  # 4 workers on the email queue

    await client.insert(
        SendEmail(to="ada@example.com", subject="hello"),
        queue="email",
    )

    await asyncio.sleep(1)
    await client.shutdown()

asyncio.run(main())

A synchronous worker model is also available via awa.Client for codebases that aren't async-first.

For application tables, keep using your existing database library. The awa.bridge helpers insert jobs through asyncpg, psycopg3, SQLAlchemy, or Django connections so app rows and jobs can commit in the same transaction.

What you get

  • Transactional enqueue — enqueue inside the same Postgres transaction as your application's writes, using your existing connection/session.
  • Vacuum-aware storage — append-only ready entries plus a partitioned receipt ring keep dead-tuple pressure bounded under sustained load. See ADR-019 and ADR-023.
  • COPY ingestionenqueue_many_copy streams directly into queue storage for high-volume Python producers. insert_many_copy remains the compatibility insert surface for canonical-storage and adapter-style callers. If workers use queue_storage_queue_stripe_count > 1, pass the same value to enqueue_many_copy.
  • Partitioned queuesPartitionedQueue maps one hot logical queue to several physical queues so workers can drain independent streams without changing Awa's durability model.
  • Crash-safe execution — heartbeat-based lease tracking; jobs whose workers vanish are rescued automatically.
  • Per-queue policy — priorities, priority aging, weighted concurrency, rate limits, deadlines, retry/backoff, cron, dead-letter queue.
  • Durable batch operations — preview, submit, monitor, and cancel async operator mutations such as reprioritizing queued jobs or moving a backlog to another queue.
  • Progress tracking — handlers can write structured progress that survives across retries.
  • Web UI (optional)pip install 'awa-pg[ui]' pulls in the awa-cli wheel, which ships the dashboard binary. Then python -m awa serve (or awa serve directly) runs a live queue inspector, DLQ triage console, and retry controls on http://127.0.0.1:3000. The default awa-pg install stays small for workers and producers that don't need the dashboard.

Migrations

python -m awa --database-url "$DATABASE_URL" migrate

Fresh installs go straight to the queue-storage engine on first migrate. Existing 0.5.x installations should follow docs/upgrade-0.5-to-0.6.md for the staged transition.

Durable batch operations

Batch operations are for operator-scale mutations. They preview a filtered set, persist a control-plane record, and let the maintenance leader apply the mutation in small chunks. Python exposes the generic envelope and helpers for the first two operation kinds:

preview = await client.preview_set_priority(
    1,
    filter={"queue": "default", "state": "available"},
)

operation = await client.set_priority(
    1,
    filter={"queue": "default"},
    submitted_by="ops@example.com",
)

operation = await client.move_queue(
    "escalations",
    priority=1,
    filter={"tag": "incident-123"},
)

active = await client.list_batch_operations(state="running")
await client.cancel_batch_operation(operation["id"])

awa.Client has the same methods for synchronous scripts. Batch operations affect queued available and scheduled jobs; running, waiting, terminal, and DLQ rows keep their current attempt state.

Partitioned FIFO and ordering keys

Queues default to strict FIFO per (queue, priority). Operators can raise awa.queue_meta.enqueue_shards on a contended queue to trade strict FIFO for throughput; the contract then becomes partitioned FIFO — strict order within each shard, no ordering promised across shards. This is the same kind of decision as choosing SQS Standard over SQS FIFO, raising Kafka partition count, or using Pub/Sub ordering keys.

If your producer enqueues related jobs that must execute in order — events for one customer, steps in one workflow, writes for one account — pass ordering_key so all jobs sharing that key land on the same shard:

await client.insert(
    UpdateCustomer(customer_id=42, payload=...),
    queue="customer-updates",
    ordering_key=b"customer-42",
)

The key can be bytes or str (encoded UTF-8). Two enqueues with the same key always pick the same shard regardless of which producer process or batch they came from. At enqueue_shards = 1 (the default) the key is ignored. See docs/adr/025-sharded-enqueue-heads.md for the full contract.

Partitioned queues

A logical queue is the workload name your application thinks in, such as customer-updates. A physical queue is the queue name stored in Postgres and claimed by workers. Most workloads use one physical queue. For a very hot workload where partitioned ordering is acceptable, use PartitionedQueue to spread one logical queue over several physical queues:

queue = awa.PartitionedQueue("customer-updates", 4)

@client.task(UpdateCustomer, queue=queue.physical_queues[0])
async def update_customer(job):
    ...

await client.start(queue.queue_configs(max_workers_per_partition=16))

await client.insert(
    UpdateCustomer(customer_id=42, payload=...),
    **queue.route_by_key("customer-42"),
)

Register the handler once and pass explicit partition configs to start(). Python handlers are dispatched by job kind; the queue name on @client.task gives start() a declared queue to validate.

route_by_key() returns queue and ordering_key, so jobs for the same key pick the same physical queue and keep per-key FIFO. route_by_index() returns a round-robin queue for workloads that do not need per-key ordering. The worker queue_configs() helper is explicit about max_workers_per_partition because each physical queue is configured independently; pass global_max_workers to start() if you need a logical fleet-wide cap.

insert_many_copy() and enqueue_many_copy() accept per-job opts, so a mixed-partition batch can still use one COPY call:

await client.enqueue_many_copy(
    jobs,
    opts=[queue.route_by_key(job.customer_id) for job in jobs],
)

Documentation

License

Dual-licensed under MIT or Apache-2.0, at your option.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (11.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

awa_pg-0.6.0rc4-cp310-abi3-macosx_11_0_arm64.whl (10.2 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

awa_pg-0.6.0rc4-cp310-abi3-macosx_10_12_x86_64.whl (10.7 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c753cf66c0bfa927e8361f521285edba47fad2fd2e5ee496b08d5cdf33d5e6b4
MD5 b1ef2128f95b6bf4847630c2a0916cd2
BLAKE2b-256 f631e5baa5502f9a50c7c7c6d117e47027d7c0312bd717bad9b4512fa7ac99bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on hardbyte/awa

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 28afbce3da387fc70fa71da9a732b7aa22f82658438897813ae80d29def5e4fc
MD5 da053418ebd0158370d68dd02377427a
BLAKE2b-256 8a8bdeeafd618b71165a7bed5c2cdb2f7cd958566372c3495f4dfca87f586201

See more details on using hashes here.

Provenance

The following attestation bundles were made for awa_pg-0.6.0rc4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on hardbyte/awa

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file awa_pg-0.6.0rc4-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for awa_pg-0.6.0rc4-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 55cb3a2db2d2db5f0272719afc9f1901d61940de8c516f65366b57603c8a1059
MD5 720183eb174b26cf7b0286332e4e14d2
BLAKE2b-256 6332afb26c96eee778438cab6a66a5782ded756df3d1602afb3b139d0cf6fa5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for awa_pg-0.6.0rc4-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on hardbyte/awa

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file awa_pg-0.6.0rc4-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for awa_pg-0.6.0rc4-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c4880f6464f09c42fc282a1569302d99c6d461675eb417efb833a57f34e8d998
MD5 0303bee2bbe3ad7fb5e650e0629f28d2
BLAKE2b-256 476e3bb297c1d6dab0c2215ae4e6d94a58c72f4e7375d691c7f70fd78a1dbad4

See more details on using hashes here.

Provenance

The following attestation bundles were made for awa_pg-0.6.0rc4-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on hardbyte/awa

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page