Frequently Asked Questions¶
This page addresses common questions and issues users encounter when working with Pulsing.
General Questions¶
What is Pulsing?¶
Pulsing is the backbone for distributed AI systems — a distributed actor runtime built in Rust, designed for Python. Streaming-first, zero dependencies, built-in discovery. Connect AI agents and services across machines without Redis, etcd, or YAML.
How does Pulsing relate to Ray?¶
Pulsing and Ray are complementary. Ray excels at distributed scheduling and resource management. Pulsing provides a communication backbone with capabilities Ray doesn't have built-in:
- Streaming: Native
async forstreaming for LLM token generation - Actor discovery: Built-in gossip protocol for named actor resolution across nodes
- Direct actor communication: Actor-to-actor calls without going through an object store
- Zero external dependencies: No GCS, Redis, or additional services needed for communication
How do I use Pulsing with Ray?¶
Use pul.mount() to bridge Ray actors onto the Pulsing network. Ray handles scheduling, Pulsing handles communication:
@ray.remote
class Worker:
def __init__(self, name):
pul.mount(self, name=name) # Join Pulsing network
See Ray + Pulsing tutorial for a full example.
When should I use Pulsing standalone (without Ray)?¶
Choose Pulsing standalone if you need:
- Lightweight actor communication without a full cluster manager
- Streaming responses (LLM applications)
- Minimal operational complexity (zero external services)
- Self-contained clustering via built-in gossip
Installation Issues¶
ImportError: No module named 'pulsing'¶
Problem: Pulsing package is not installed or not in Python path.
Solutions:
-
Install Pulsing:
-
For development:
-
Check Python path:
Build failures on macOS/Linux¶
Problem: Rust compilation issues.
Solutions:
-
Install Rust:
-
Install system dependencies (Ubuntu/Debian):
-
Install system dependencies (macOS):
Runtime Issues¶
Actor not responding to messages¶
Problem: Actor appears to be stuck or not processing messages.
Possible causes:
- Blocking operations: Actor is blocked on synchronous I/O
- Infinite loop: Actor code contains an infinite loop
- Deadlock: Actor is waiting for a message that will never arrive
Solutions:
# ❌ Bad: Blocking I/O in actor
@pul.remote
class BadActor:
def process(self, url):
response = requests.get(url) # Blocks the actor!
return response.text
# ✅ Good: Use async I/O
@pul.remote
class GoodActor:
async def process(self, url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
Connection refused errors¶
Problem: Cannot connect to remote actors.
Possible causes:
- Wrong address: Actor system listening on different address
- Firewall: Network traffic blocked
- TLS issues: Certificate validation failures
Solutions:
-
Check actor system address:
-
Disable TLS for testing:
Memory leaks¶
Problem: Memory usage grows over time.
Possible causes:
- Message accumulation: Messages not being processed fast enough
- Large message payloads: Messages containing large data structures
- Actor leaks: Actors not being properly cleaned up
Solutions:
-
Monitor mailbox size:
-
Use streaming for large data:
Performance Issues¶
High latency¶
Problem: Message round-trip takes too long.
Optimizations:
-
Use local actors when possible:
-
Batch messages:
-
Use tell() for fire-and-forget:
Serialization overhead¶
Problem: Message serialization is slow.
Solutions:
-
Use efficient data formats:
-
Avoid sending large payloads:
Deployment Issues¶
Clustering not working¶
Problem: Multiple nodes cannot discover each other.
Solutions:
-
Check seed node configuration:
-
Verify network connectivity:
-
Check firewall settings:
Load balancing issues¶
Problem: Requests not distributed evenly across cluster.
Solutions:
-
Use round-robin resolution:
-
Check actor distribution:
Ray Integration Issues¶
Using Pulsing with Ray¶
Common issues:
-
API differences:
-
Async/await everywhere:
Getting Help¶
If you can't find the answer here:
- Check the documentation: User Guide and API Reference
- Search existing issues: GitHub Issues
- Ask the community: GitHub Discussions
- File a bug report: If you found a bug, please open an issue
Contributing¶
Found an issue with this FAQ? Help improve it!