procspawn

This crate provides the ability to spawn processes with a function similar to thread::spawn.

Unlike thread::spawn data cannot be passed in closures but must be explicitly passed as single argument which must be serde serializable. The return value from the spawned closure also must be serializable and can then be unwrapped from the returned join handle. If your function has data enclosed it will panic at runtime.

```rust // call this early in your main() function. This is where all spawned // functions will be invoked. procspawn::init();

let data = vec![1, 2, 3, 4]; let handle = procspawn::spawn(data, |data| { println!("Received data {:?}", &data); data.into_iter().sum::() }); let result = handle.join().unwrap(); ```

Because procspawn will invoke a subprocess and there is currently no reliable way to intercept main in Rust it's necessary for you to call procspawn::init at an early time in the program. The place where this will be called is the entrypoint for the subprocesses spawned. The subprocess is invoked with the same arguments and environment variables by default.

spawn can pass arbitrary serializable data, including IPC senders and receivers from the ipc-channel crate, down to the new process.

Pools

The default way to spawn processes will start and stop processes constantly. For more uses it's a better idea to spawn a Pool which will keep processes around for reuse. Between calls the processes will stay around which also means the can keep state between calls if needed.

Panics

By default panics are captured and serialized across process boundaries. This requires that the backtrace crate is used with serialization support. If you do not need this feature you can disable the backtrace crate and disable panic handling through the ProcConfig object.

Feature Flags

The following feature flags exist:

Bincode Limitations

This crate uses bincode internally for inter process communication. Bincode currently has some limitations which make some serde features incompatible with it. Most notably if you use #[serde(flatten)] data cannot be sent across the processes. To work around this you can enable the json feature and wrap affected objects in the Json wrapper to force JSON serialization.

Platform Support

Currently this crate only supports macOS and Linux because ipc-channel itself does not support Windows yet.

Examples

Here are some examples of procspawn in action:

More examples can be found in the example folder: examples

License: MIT/Apache-2.0