#communication #multiprocessing #channel #seamless #cross-process #synchronously

crossmist

Efficient and seamless cross-process communication, both synchronously and asynchronously

18 releases (5 stable)

new 1.0.5 May 15, 2024
1.0.4 May 14, 2024
0.2.4 Jan 25, 2024
0.2.1 Dec 19, 2023
0.1.4 Jul 29, 2023

#217 in Asynchronous

Download history 7/week @ 2024-01-22 47/week @ 2024-02-26 10/week @ 2024-03-11 29/week @ 2024-04-01 19/week @ 2024-04-08 350/week @ 2024-04-29 190/week @ 2024-05-06

549 downloads per month

MIT license

165KB
3K SLoC

crossmist

License: MIT docs.rs crates.io

crossmist provides efficient and seamless cross-process communication for Rust. It provides semantics similar to std::thread::spawn and single-producer single-consumer channels, both synchronously and asynchronously.

Installation

$ cargo add crossmist

Or add the following to your Cargo.toml:

crossmist = "1.0"

Documentation

Check out docs.rs.

Motivational examples

This crate allows you to easily perform computations in another process without creating a separate executable or parsing command line arguments manually. For example, the simplest example, computing a sum of several numbers in a one-shot subprocess, looks like this:

#[crossmist::main]
fn main() {
    println!("5 + 7 = {}", add.run(vec![5, 7]).unwrap());
}

#[crossmist::func]
fn add(nums: Vec<i32>) -> i32 {
    nums.into_iter().sum()
}

This crate also supports long-lived tasks with constant cross-process communication:

#[crossmist::main]
fn main() {
    let (mut ours, theirs) = crossmist::duplex().unwrap();
    add.spawn(theirs).expect("Failed to spawn child");
    for i in 1..=5 {
        for j in 1..=5 {
            println!("{i} + {j} = {}", ours.request(&vec![i, j]).unwrap());
        }
    }
}

#[crossmist::func]
fn add(mut chan: crossmist::Duplex<i32, Vec<i32>>) {
    while let Some(nums) = chan.recv().unwrap() {
        chan.send(&nums.into_iter().sum());
    }
}

Almost arbitrary objects can be passed between processes and across channels, including file handles, sockets, and other channels.

Dependencies

~3–49MB
~741K SLoC