Skip to main content

A cross-platform IPC (Inter-Process Communication) library powered by Rust

Project description

ipckit

Crates.io PyPI Documentation CI License Python Versions Rust Version Downloads

A high-performance, cross-platform IPC (Inter-Process Communication) library for Rust and Python, powered by Rust.

中文文档

✨ Features

  • 🚀 High Performance - Written in Rust, with zero-copy where possible
  • 🔀 Cross-Platform - Works on Windows, Linux, and macOS
  • 🐍 Python Bindings - First-class Python support via PyO3
  • 📦 Multiple IPC Methods - Pipes, Shared Memory, Channels, and File-based IPC
  • 🔒 Thread-Safe - Safe concurrent access across processes
  • Native JSON - Built-in fast JSON serialization using Rust's serde_json
  • 🛡️ Graceful Shutdown - Built-in support for graceful channel shutdown

📦 Installation

Python

pip install ipckit

Rust

[dependencies]
ipckit = "0.1"

🚀 Quick Start

Anonymous Pipe (Parent-Child Communication)

Python:

import ipckit
import subprocess

# Create pipe pair
pipe = ipckit.AnonymousPipe()

# Write to pipe
pipe.write(b"Hello from parent!")

# Read from pipe
data = pipe.read(1024)
print(data)

Rust:

use ipckit::AnonymousPipe;

fn main() -> ipckit::Result<()> {
    let pipe = AnonymousPipe::new()?;
    
    pipe.write_all(b"Hello from Rust!")?;
    
    let mut buf = [0u8; 1024];
    let n = pipe.read(&mut buf)?;
    println!("{}", String::from_utf8_lossy(&buf[..n]));
    
    Ok(())
}

Named Pipe (Unrelated Process Communication)

Python Server:

import ipckit

# Create server
server = ipckit.NamedPipe.create("my_pipe")
print("Waiting for client...")
server.wait_for_client()

# Communicate
data = server.read(1024)
server.write(b"Response from server")

Python Client:

import ipckit

# Connect to server
client = ipckit.NamedPipe.connect("my_pipe")

# Communicate
client.write(b"Hello from client")
response = client.read(1024)
print(response)

Shared Memory (Fast Data Exchange)

Python:

import ipckit

# Create shared memory (owner)
shm = ipckit.SharedMemory.create("my_shm", 4096)
shm.write(0, b"Shared data here!")

# In another process, open existing
shm2 = ipckit.SharedMemory.open("my_shm")
data = shm2.read(0, 17)
print(data)  # b"Shared data here!"

Rust:

use ipckit::SharedMemory;

fn main() -> ipckit::Result<()> {
    // Create
    let shm = SharedMemory::create("my_shm", 4096)?;
    shm.write(0, b"Hello from Rust!")?;
    
    // Open in another process
    let shm2 = SharedMemory::open("my_shm")?;
    let data = shm2.read(0, 16)?;
    
    Ok(())
}

IPC Channel (High-Level Message Passing)

Python:

import ipckit

# Server
channel = ipckit.IpcChannel.create("my_channel")
channel.wait_for_client()

# Send/receive JSON
channel.send_json({"type": "greeting", "message": "Hello!"})
response = channel.recv_json()
print(response)

File Channel (Frontend-Backend Communication)

Perfect for desktop applications where Python backend communicates with web frontend.

Python Backend:

import ipckit

# Create backend channel
channel = ipckit.FileChannel.backend("./ipc_channel")

# Send request to frontend
request_id = channel.send_request("getData", {"key": "user_info"})

# Wait for response
response = channel.wait_response(request_id, timeout_ms=5000)
print(response)

# Send events
channel.send_event("status_update", {"status": "ready"})

JavaScript Frontend:

// Read from: ./ipc_channel/backend_to_frontend.json
// Write to:  ./ipc_channel/frontend_to_backend.json

async function pollMessages() {
    const response = await fetch('./ipc_channel/backend_to_frontend.json');
    const messages = await response.json();
    // Process new messages...
}

Native JSON Functions

ipckit provides Rust-native JSON functions that are faster than Python's built-in json module:

import ipckit

# Serialize (1.2x faster than json.dumps)
data = {"name": "test", "values": [1, 2, 3]}
json_str = ipckit.json_dumps(data)

# Pretty print
pretty_str = ipckit.json_dumps_pretty(data)

# Deserialize
obj = ipckit.json_loads('{"key": "value"}')

Graceful Shutdown

When using IPC channels with event loops (like WebView, GUI frameworks), background threads may continue sending messages after the main event loop has closed, causing errors. The GracefulChannel feature solves this problem.

Python:

import ipckit

# Create channel with graceful shutdown support
channel = ipckit.GracefulIpcChannel.create("my_channel")
channel.wait_for_client()

# ... use channel normally ...
data = channel.recv()
channel.send(b"response")

# Graceful shutdown - prevents new operations and waits for pending ones
channel.shutdown()
channel.drain()  # Wait for all pending operations to complete

# Or use shutdown with timeout (in milliseconds)
channel.shutdown_timeout(5000)  # 5 second timeout

Rust:

use ipckit::{GracefulIpcChannel, GracefulChannel};
use std::time::Duration;

fn main() -> ipckit::Result<()> {
    let mut channel = GracefulIpcChannel::<Vec<u8>>::create("my_channel")?;
    channel.wait_for_client()?;
    
    // ... use channel ...
    
    // Graceful shutdown
    channel.shutdown();
    channel.drain()?;
    
    // Or with timeout
    channel.shutdown_timeout(Duration::from_secs(5))?;
    
    Ok(())
}

Key Benefits:

  • Prevents EventLoopClosed and similar errors
  • Thread-safe shutdown signaling
  • Tracks pending operations with RAII guards
  • Configurable drain timeout

📖 IPC Methods Comparison

Method Use Case Performance Complexity
Anonymous Pipe Parent-child processes Fast Low
Named Pipe Unrelated processes Fast Medium
Shared Memory Large data, frequent access Fastest High
IPC Channel Message passing Fast Low
File Channel Frontend-backend Moderate Low
Graceful Channel Event loop integration Fast Low

🏗️ Architecture

┌─────────────────────────────────────────────────────────────┐
│                     Python Application                       │
├─────────────────────────────────────────────────────────────┤
│                    ipckit Python Bindings                    │
│                         (PyO3)                               │
├─────────────────────────────────────────────────────────────┤
│                     ipckit Rust Core                         │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────────────┐│
│  │  Pipes  │ │   SHM   │ │ Channel │ │    File Channel     ││
│  └─────────┘ └─────────┘ └─────────┘ └─────────────────────┘│
│  ┌─────────────────────────────────────────────────────────┐│
│  │              Graceful Shutdown Layer                    ││
│  │  (GracefulNamedPipe, GracefulIpcChannel, ShutdownState) ││
│  └─────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────┤
│              Platform Abstraction Layer                      │
│         (Windows / Linux / macOS)                            │
└─────────────────────────────────────────────────────────────┘

🔧 Building from Source

Prerequisites

  • Rust 1.70+
  • Python 3.7+
  • maturin (pip install maturin)

Build

# Clone repository
git clone https://github.com/loonghao/ipckit.git
cd ipckit

# Build Python package
maturin develop --release

# Run tests
pytest tests/
cargo test

📝 License

This project is dual-licensed under:

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

📚 Documentation

🙏 Acknowledgments

  • PyO3 - Rust bindings for Python
  • maturin - Build and publish Rust-based Python packages
  • serde - Serialization framework for Rust

Project details


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.

ipckit-0.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (363.8 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

ipckit-0.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (365.0 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

ipckit-0.1.1-cp38-abi3-win_amd64.whl (302.4 kB view details)

Uploaded CPython 3.8+Windows x86-64

ipckit-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (385.0 kB view details)

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

ipckit-0.1.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (364.7 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

ipckit-0.1.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (708.0 kB view details)

Uploaded CPython 3.8+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file ipckit-0.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ipckit-0.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4bc3b12303449a88da4b339cd36f668b1371509b86e6d9e9784ba9296ecb9c35
MD5 7a76b89654d734afb34fb96e4b7db6fe
BLAKE2b-256 12f7a4161d4c0d30fd54493e7819597a97d8b1028319685ce94bfb8421004e1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipckit-0.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on loonghao/ipckit

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

File details

Details for the file ipckit-0.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ipckit-0.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d2c1ee40b55138d0bdbe4d665ce5798483bfa50d8d8d0466301dae5b804dfe28
MD5 85efbf433f711f80560dee42a7709e64
BLAKE2b-256 5c82e6e06b5217636f7476d1019549a723eb8eeb5508c7a5e442ebe0a0ca5a86

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipckit-0.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on loonghao/ipckit

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

File details

Details for the file ipckit-0.1.1-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: ipckit-0.1.1-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 302.4 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ipckit-0.1.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c40564d4ddf8c03dd6cbca399ca69086616fdc744f72d87ae3637e75b385cdb2
MD5 771480feebefd2cec30889f974dc320d
BLAKE2b-256 c8427acf0279b88e2f978b58073323c0ce728a796c6ca9e110e303e52f11849c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipckit-0.1.1-cp38-abi3-win_amd64.whl:

Publisher: release.yml on loonghao/ipckit

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

File details

Details for the file ipckit-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ipckit-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f51e849660022ac13334154c6ac57f67acdf20c65d2d73d0f4bf824ea1a69d2a
MD5 413231e814963eba890e0026b7bcac2b
BLAKE2b-256 9fc09e48048df4fcfc604c376fb19b00d50cc4277685193d2c761cd25e9364eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipckit-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on loonghao/ipckit

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

File details

Details for the file ipckit-0.1.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ipckit-0.1.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b5017f60c3e4eed5c09e95795f811e013b1a14e527bbfe58a4f6f392520e8ca9
MD5 6fab548071be85958bab9bb67122d3a4
BLAKE2b-256 dfb5594e905e32d86c91dd83da335fef22659211a2e4a6eca0037e62a7c6bec1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipckit-0.1.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on loonghao/ipckit

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

File details

Details for the file ipckit-0.1.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for ipckit-0.1.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 a1082f536d2cade535d4fb0cd3aaf01e51d47befc40983ee9330454908a7460f
MD5 2923007ae6a12be07799e2d72058f15a
BLAKE2b-256 21a9a3b55f361b18d58952e8eee561d2f0efa1b85fe95631513d07a28b9c864c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ipckit-0.1.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on loonghao/ipckit

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