- Notifications
You must be signed in to change notification settings - Fork30
Coroutine I/O for Rust
License
Apache-2.0 and 2 other licenses found
Licenses found
Apache-2.0
LICENSE-APACHEMIT
LICENSE-MITUnknown
LICENSE-THIRD-PARTYNotificationsYou must be signed in to change notification settings
zonyitoo/coio-rs
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Coroutine scheduling with work-stealing algorithm.
WARN: Possibly crash because of TLS inline, check#56 for more detail!
- Non-blocking I/O
- Work-stealing coroutine scheduling
- Asynchronous computing APIs
Note: You must useNightly Rust to build this Project.
[dependencies.coio]git ="https://github.com/zonyitoo/coio-rs.git"
externcrate coio;use coio::Scheduler;fnmain(){Scheduler::new().run(||{for _in0..10{println!("Heil Hydra");Scheduler::sched();// Yields the current coroutine}}).unwrap();}
externcrate coio;use std::io::{Read,Write};use coio::net::TcpListener;use coio::{spawn,Scheduler};fnmain(){// Spawn a coroutine for accepting new connectionsScheduler::new().with_workers(4).run(move||{let acceptor =TcpListener::bind("127.0.0.1:8080").unwrap();println!("Waiting for connection ...");for streamin acceptor.incoming(){let(mut stream, addr) = stream.unwrap();println!("Got connection from {:?}", addr);// Spawn a new coroutine to handle the connectionspawn(move||{letmut buf =[0;1024];loop{match stream.read(&mut buf){Ok(0) =>{println!("EOF");break;},Ok(len) =>{println!("Read {} bytes, echo back", len); stream.write_all(&buf[0..len]).unwrap();},Err(err) =>{println!("Error occurs: {:?}", err);break;}}}println!("Client closed");});}}).unwrap();}
Will cause all pending coroutines to be killed.
externcrate coio;use std::sync::Arc;use std::sync::atomic::{AtomicUsize,Ordering};use std::time::Duration;use coio::Scheduler;fnmain(){let counter =Arc::new(AtomicUsize::new(0));let cloned_counter = counter.clone();let result =Scheduler::new().run(move||{// Spawn a new coroutineScheduler::spawn(move||{structGuard(Arc<AtomicUsize>);implDropforGuard{fndrop(&mutself){self.0.store(1,Ordering::SeqCst);}}// If the _guard is dropped, it will store 1 to the counterlet _guard =Guard(cloned_counter); coio::sleep(Duration::from_secs(10));println!("Not going to run this line");});// Exit right now, which will cause the coroutine to be destroyed.panic!("Exit right now!!");});// The coroutine's stack is unwound properlyassert!(result.is_err() && counter.load(Ordering::SeqCst) ==1);}
Seebenchmarks for more details.
About
Coroutine I/O for Rust
Resources
License
Apache-2.0 and 2 other licenses found
Licenses found
Apache-2.0
LICENSE-APACHEMIT
LICENSE-MITUnknown
LICENSE-THIRD-PARTYUh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
No releases published
Packages0
No packages published
Uh oh!
There was an error while loading.Please reload this page.
Contributors8
Uh oh!
There was an error while loading.Please reload this page.