7 releases

0.3.0-alpha.8 Jul 29, 2019
0.3.0-alpha.7 Jun 24, 2019
0.3.0-alpha.6 May 12, 2019
0.3.0-alpha.5 Apr 29, 2019
0.3.0-alpha.1 Feb 26, 2019

#625 in Concurrency

Download history 51/week @ 2024-01-22 29/week @ 2024-01-29 53/week @ 2024-02-05 87/week @ 2024-02-12 87/week @ 2024-02-19 103/week @ 2024-02-26 121/week @ 2024-03-04 109/week @ 2024-03-11 114/week @ 2024-03-18 99/week @ 2024-03-25 161/week @ 2024-04-01 88/week @ 2024-04-08 119/week @ 2024-04-15 121/week @ 2024-04-22 102/week @ 2024-04-29 89/week @ 2024-05-06

445 downloads per month
Used in 2 crates (via naja_async_runtime)

MIT/Apache

15KB
290 lines

juliex - a minimal futures executor

juliex is a concurrent executor for Rust futures. It is implemented as a threadpool executor using a single, shared queue. Algorithmically, it is very similar to the Threadpool executor provided by the futures crate. The main difference is that juliex uses a crossbeam channel and performs a single allocation per spawned future, whereas the futures Threadpool uses std concurrency primitives and multiple allocations.

Similar to romio - an IO reactor - juliex currently provides no user configuration. It exposes the most minimal API possible.

Example

#![feature(async_await)]

use std::io;

use futures::StreamExt;
use futures::executor;
use futures::io::AsyncReadExt;

use romio::{TcpListener, TcpStream};

fn main() -> io::Result<()> {
    executor::block_on(async {
        let mut listener = TcpListener::bind(&"127.0.0.1:7878".parse().unwrap())?;
        let mut incoming = listener.incoming();

        println!("Listening on 127.0.0.1:7878");

        while let Some(stream) = incoming.next().await {
            let stream = stream?;
            let addr = stream.peer_addr()?;

            juliex::spawn(async move {
                println!("Accepting stream from: {}", addr);

                echo_on(stream).await.unwrap();

                println!("Closing stream from: {}", addr);
            });
        }

        Ok(())
    })
}

async fn echo_on(stream: TcpStream) -> io::Result<()> {
    let (mut reader, mut writer) = stream.split();
    reader.copy_into(&mut writer).await?;
    Ok(())
}

Safety

This crate uses unsafe internally around atomic access. Invariants around this are manually checked.

License

MIT OR Apache-2.0

Dependencies

~1.5MB
~24K SLoC