Crates.io | crossmist |
lib.rs | crossmist |
version | 1.1.2 |
source | src |
created_at | 2023-07-27 01:06:00.486741 |
updated_at | 2024-09-06 12:34:15.967236 |
description | Efficient and seamless cross-process communication, both synchronously and asynchronously |
homepage | |
repository | https://github.com/purplesyringa/crossmist/ |
max_upload_size | |
id | 926980 |
size | 210,761 |
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.
$ cargo add crossmist
Or add the following to your Cargo.toml
:
crossmist = "1.1.1"
Check out docs.rs.
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.