TLQ Client for Python
A Python client library for TLQ (Tiny Little Queue), a minimal message queue server written in Rust.
Features
- Simple, lightweight Python client for TLQ
- Full support for all TLQ API operations
- Built-in retry logic with exponential backoff
- Environment variable configuration
- Type hints and comprehensive error handling
- Context manager support
- Extensive test coverage
Installation
pip install tlq-client
Quick Start
from tlq_client import TLQClient
client = TLQClient()
message_id = client.add_message("Hello, TLQ!")
print(f"Added message: {message_id}")
messages = client.get_messages(count=1)
for message in messages:
print(f"Received: {message.body} (ID: {message.id})")
client.delete_messages(message.id)
Configuration
Constructor Parameters
client = TLQClient(
host="localhost",
port=1337,
timeout=30.0,
max_retries=3
)
Environment Variables
You can also configure the client using environment variables:
TLQ_HOST
- Server hostname (default: localhost)
TLQ_PORT
- Server port (default: 1337)
TLQ_TIMEOUT
- Request timeout in seconds (default: 30.0)
TLQ_MAX_RETRIES
- Maximum retry attempts (default: 3)
export TLQ_HOST=queue.example.com
export TLQ_PORT=8080
export TLQ_TIMEOUT=60.0
export TLQ_MAX_RETRIES=5
python your_script.py
API Reference
TLQClient
health_check() -> bool
Check if the TLQ server is healthy.
if client.health_check():
print("TLQ server is running")
else:
print("TLQ server is not available")
add_message(body: str) -> str
Add a message to the queue. Returns the message ID.
message_id = client.add_message("Process this task")
Note: Messages are limited to 64KB in size.
get_messages(count: int = 1) -> List[TLQMessage]
Retrieve messages from the queue.
messages = client.get_messages()
messages = client.get_messages(count=5)
for message in messages:
print(f"ID: {message.id}")
print(f"Body: {message.body}")
print(f"State: {message.state}")
print(f"Retry Count: {message.retry_count}")
delete_messages(message_ids: Union[str, List[str]])
Delete processed messages from the queue.
client.delete_messages(message_id)
client.delete_messages([id1, id2, id3])
retry_messages(message_ids: Union[str, List[str]])
Return messages to the queue for retry.
client.retry_messages(message_id)
client.retry_messages([id1, id2, id3])
purge_queue()
Clear all messages from the queue.
client.purge_queue()
TLQMessage
Message objects returned by get_messages()
:
@dataclass
class TLQMessage:
id: str
body: str
state: str
retry_count: int
Error Handling
The client provides specific exception types for different error conditions:
from tlq_client import (
TLQError,
TLQConnectionError,
TLQTimeoutError,
TLQServerError,
TLQValidationError
)
try:
client.add_message("Hello, TLQ!")
except TLQValidationError as e:
print(f"Validation error: {e}")
except TLQConnectionError as e:
print(f"Connection error: {e}")
except TLQTimeoutError as e:
print(f"Timeout error: {e}")
except TLQServerError as e:
print(f"Server error: {e} (status: {e.status_code})")
except TLQError as e:
print(f"TLQ error: {e}")
Context Manager Support
The client can be used as a context manager to ensure proper cleanup:
with TLQClient() as client:
message_id = client.add_message("Hello!")
messages = client.get_messages()
Examples
Basic Producer
from tlq_client import TLQClient
def produce_messages():
with TLQClient() as client:
for i in range(10):
message_id = client.add_message(f"Task {i}")
print(f"Queued task {i}: {message_id}")
if __name__ == "__main__":
produce_messages()
Basic Consumer
import time
from tlq_client import TLQClient, TLQError
def consume_messages():
with TLQClient() as client:
while True:
try:
messages = client.get_messages(count=5)
if not messages:
print("No messages available, sleeping...")
time.sleep(1)
continue
for message in messages:
try:
print(f"Processing: {message.body}")
time.sleep(0.1)
client.delete_messages(message.id)
print(f"Completed: {message.id}")
except Exception as e:
print(f"Failed to process {message.id}: {e}")
client.retry_messages(message.id)
except TLQError as e:
print(f"TLQ error: {e}")
time.sleep(5)
if __name__ == "__main__":
consume_messages()
Configuration from Environment
import os
from tlq_client import TLQClient
os.environ['TLQ_HOST'] = 'queue.myapp.com'
os.environ['TLQ_PORT'] = '8080'
os.environ['TLQ_TIMEOUT'] = '60'
client = TLQClient()
print(f"Connected to {client.config.base_url}")
Development
Setup Development Environment
python3 -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
Running Tests
source venv/bin/activate
pytest
pytest -v
pytest --cov=tlq_client --cov-report=html
pytest tests/test_client.py
pytest tests/test_client.py::TestTLQClient::test_add_message_success
Code Quality
black tlq_client tests
isort tlq_client tests
flake8 tlq_client tests
mypy tlq_client
Requirements
- Python 3.7+
- requests >= 2.25.0
License
MIT License - see LICENSE file for details.
Related Projects