6 releases

new 0.3.4 Jul 7, 2024
0.3.3 Sep 12, 2020
0.3.2 May 17, 2020
0.3.1 Dec 27, 2019
0.1.0 Nov 3, 2018

#260 in Concurrency

Download history 60/week @ 2024-03-15 51/week @ 2024-03-22 124/week @ 2024-03-29 116/week @ 2024-04-05 56/week @ 2024-04-12 72/week @ 2024-04-19 96/week @ 2024-04-26 156/week @ 2024-05-03 211/week @ 2024-05-10 96/week @ 2024-05-17 60/week @ 2024-05-24 75/week @ 2024-05-31 112/week @ 2024-06-07 63/week @ 2024-06-14 63/week @ 2024-06-21 15/week @ 2024-06-28

261 downloads per month
Used in 7 crates (2 directly)

MPL-2.0 license

11KB
109 lines

mpsc_requests

docs.rs badge

For more info, see docs.rs.


lib.rs:

mpsc_requests rewritten for crossbeam, written by @stjepang (https://github.com/crossbeam-rs/crossbeam/issues/353#issuecomment-484013974)

crossbeam_requests is a small library built on top of crossbeam-channel but with the addition of the consumer responding with a message to the producer. Since the producer no longer only produces and the consumer no longer only consumes, the Producer is renamed to [RequestSender] and the Consumer is renamed to [RequestReceiver].

This library is based on crossbeam-requests instead of mpsc channels in the standard library because crossbeam has better performance and better compatibility with android.

A perfect use-case for this library is single-threaded databases which need to be accessed from multiple threads (such as SQLite)

Here's a diagram of the dataflow

|--------------------------------------------------------------------------------------| | Thread | Request thread | Respond thread | Request thread | |--------------------------------------------------------------------------------------| | Struct | RequestSender -> RequestReceiver -> ResponseSender -> ResponseReceiver | | (methods) | (request) -> (poll, poll_loop) -> (respond) -> (collect) | |--------------------------------------------------------------------------------------|

Examples

For more examples, see the examples directory

For even more examples see the tests in the tests directory

Simple echo example

use std::thread;
use mpsc_requests::channel;

type RequestType = String;
type ResponseType = String;
let (requester, responder) = channel::<RequestType, ResponseType>();
thread::spawn(move || {
    responder.poll_loop(|req, res_sender| {
        res_sender.respond(req);
    });
});
let msg = String::from("Hello");
let receiver = requester.request(msg.clone()).unwrap();
let res = receiver.collect().unwrap();
assert_eq!(res, msg);

Dependencies

~350KB