All notable changes to async-std will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.2.0 - 2019-11-27
This patch includes some minor quality-of-life improvements, introduces a
new Stream::unzip
API, and adds verbose errors to our networking types.
This means if you can't connect to a socket, you'll never have to wonder again which address it was you couldn't connect to, instead of having to go through the motions to debug what the address was.
Unzip a stream of tuples into two collections:
use async_std::prelude::*;
use async_std::stream;
let s = stream::from_iter(vec![(1,2), (3,4)]);
let (left, right): (Vec<_>, Vec<_>) = s.unzip().await;
assert_eq!(left, [1, 3]);
assert_eq!(right, [2, 4]);
- Added
Stream::unzip
as "unstable". - Added verbose errors to the networking types.
- Enabled CI on master branch.
Future::join
andFuture::try_join
can now join futures with different output types.
- Fixed the docs and
Debug
output ofBufWriter
. - Fixed a bug in
Stream::throttle
that made it consume too much CPU.
1.1.0 - 2019-11-21
This patch introduces a faster scheduler algorithm, Stream::throttle
, and
stabilizes task::yield_now
. Additionally we're introducing several more stream
APIs, bringing us to almost complete parity with the standard library.
Furthermore our path
submodule now returns more context in errors. So if
opening a file fails, async-std will tell you which file was failed to open,
making it easier to write and debug programs.
let start = Instant::now();
let mut s = stream::interval(Duration::from_millis(5))
.throttle(Duration::from_millis(10))
.take(2);
s.next().await;
assert!(start.elapsed().as_millis() >= 5);
s.next().await;
assert!(start.elapsed().as_millis() >= 15);
s.next().await;
assert!(start.elapsed().as_millis() >= 25);
- Added
Stream::throttle
as "unstable". - Added
Stream::count
as "unstable". - Added
Stream::max
as "unstable". - Added
Stream::successors
as "unstable". - Added
Stream::by_ref
as "unstable". - Added
Stream::partition
as "unstable". - Added contextual errors to the
path
submodule. - Added
os::windows::symlink_dir
as "unstable". - Added
os::windows::symlink_file
as "unstable". - Stabilized
task::yield_now
.
- We now ignore seek errors when rolling back failed
read
calls onFile
. - Fixed a bug where
Stream::max_by_key
was returning the wrong result. - Fixed a bug where
Stream::min_by_key
was returning the wrong result.
- Applied various fixes to the tutorial.
- Fixed an issue with Clippy.
- Optimized an internal code generation macro, improving compilation speeds.
- Removed an
Unpin
bound fromstream::Once
. - Removed various extra internal uses of
pin_mut!
. - Simplified
Stream::any
andStream::all
's internals. - The
surf
example is now enabled again. - Tweaked some streams internals.
- Updated
futures-timer
to 2.0.0, improving compilation speed. - Upgraded
async-macros
to 2.0.0. Stream::merge
now uses randomized ordering to reduce overall latency.- The scheduler is now more efficient by keeping a slot for the next task to run. This is similar to Go's scheduler, and Tokio's scheduler.
- Fixed the documentation of the
channel
types to link back to thechannel
function.
1.0.1 - 2019-11-12
We were seeing a regression in our fs performance, caused by too many long-running tasks. This patch fixes that regression by being more proactive about closing down idle threads.
- Improved thread startup/shutdown algorithm in
task::spawn_blocking
. - Fixed a typo in the tutorial.
1.0.0 - 2019-11-11
This release marks the 1.0.0
release of async-std; a major milestone for our
development. This release itself mostly includes quality of life improvements
for all of modules, including more consistent API bounds for a lot of our
submodules.
The biggest change is that we're now using the full semver range,
major.minor.patch
, and any breaking changes to our "stable" APIs will require
an update of the major
number.
We're excited we've hit this milestone together with you all. Thank you!
- Added
Future::join
as "unstable", replacingfuture::join!
. - Added
Future::try_join
as "unstable", replacingfuture::try_join!
. - Enabled
stable
andbeta
channel testing on CI. - Implemented
FromIterator
andExtend
forPathBuf
. - Implemented
FromStream
forPathBuf
. - Loosened the trait bounds of
io::copy
on "unstable".
- Added a
Sync
bound toRwLock
, resolving a memory safety issue. - Fixed a bug in
Stream::take_while
where it could continue after it should've ended. - Fixed a bug where our
attributes
Cargo feature wasn't working as intended. - Improved documentation of
Stream::merge
, documenting ordering guarantees. - Update doc imports in examples to prefer async-std's types.
- Various quality of life improvements to the
future
submodule. - Various quality of life improvements to the
path
submodule. - Various quality of life improvements to the
stream
submodule.
- Removed
future::join!
in favor ofFuture::join
. - Removed
future::try_join!
in favor ofFuture::try_join
.
0.99.12 - 2019-11-07
This patch upgrades us to futures
0.3, support for async/await
on Rust
Stable, performance improvements, and brand new module-level documentation.
- Added
Future::flatten
as "unstable". - Added
Future::race
as "unstable" (replacesfuture::select!
). - Added
Future::try_race
as "unstable" (replacesfuture::try_select!
). - Added
Stderr::lock
as "unstable". - Added
Stdin::lock
as "unstable". - Added
Stdout::lock
as "unstable". - Added
Stream::copied
as "unstable". - Added
Stream::eq
as "unstable". - Added
Stream::max_by_key
as "unstable". - Added
Stream::min
as "unstable". - Added
Stream::ne
as "unstable". - Added
Stream::position
as "unstable". - Added
StreamExt
andFutureExt
as enumerable in theprelude
. - Added
TcpListener
andTcpStream
integration tests. - Added
stream::from_iter
. - Added
sync::WakerSet
for internal use. - Added an example to handle both
IP v4
andIP v6
connections. - Added the
default
Cargo feature. - Added the
attributes
Cargo feature. - Added the
std
Cargo feature.
- Fixed a bug in the blocking threadpool where it didn't spawn more than one thread.
- Fixed a bug with
Stream::merge
where sometimes it ended too soon. - Fixed a bug with our GitHub actions setup.
- Fixed an issue where our channels could spuriously deadlock.
- Refactored the
task
module. - Removed a deprecated GitHub action.
- Replaced
futures-preview
withfutures
. - Replaced
lazy_static
withonce_cell
. - Replaced all uses of
VecDequeue
in the examples withstream::from_iter
. - Simplified
sync::RwLock
using the internalsync::WakerSet
type. - Updated the
path
submodule documentation to match std. - Updated the mod-level documentation to match std.
- Removed
future::select!
(replaced byFuture::race
). - Removed
future::try_select!
(replaced byFuture::try_race
).
0.99.11 - 2019-10-29
This patch introduces async_std::sync::channel
, a novel asynchronous port of
the ultra-fast Crossbeam channels. This has been one of the most anticipated
features for async-std, and we're excited to be providing a first version of
this!
In addition to channels, this patch has the regular list of new methods, types, and doc fixes.
Send and receive items from a channel
// Create a bounded channel with a max-size of 1
let (s, r) = channel(1);
// This call returns immediately because there is enough space in the channel.
s.send(1).await;
task::spawn(async move {
// This call blocks the current task because the channel is full.
// It will be able to complete only after the first message is received.
s.send(2).await;
});
// Receive items from the channel
task::sleep(Duration::from_secs(1)).await;
assert_eq!(r.recv().await, Some(1));
assert_eq!(r.recv().await, Some(2));
- Added
Future::delay
as "unstable" - Added
Stream::flat_map
as "unstable" - Added
Stream::flatten
as "unstable" - Added
Stream::product
as "unstable" - Added
Stream::sum
as "unstable" - Added
Stream::min_by_key
- Added
Stream::max_by
- Added
Stream::timeout
as "unstable" - Added
sync::channel
as "unstable". - Added doc links from instantiated structs to the methods that create them.
- Implemented
Extend
+FromStream
forPathBuf
.
- Fixed an issue with
block_on
so it works even when nested. - Fixed issues with our Clippy check on CI.
- Replaced our uses of
cfg_if
with our own macros, simplifying the codebase. - Updated the homepage link in
Cargo.toml
to point to async.rs. - Updated the module-level documentation for
stream
andsync
. - Various typos and grammar fixes.
- Removed redundant file flushes, improving the performance of
File
operations
Nothing was removed in this release.
0.99.10 - 2019-10-16
This patch stabilizes several core concurrency macros, introduces async versions
of Path
and PathBuf
, and adds almost 100 other commits.
Asynchronously read directories from the filesystem
use async_std::fs;
use async_std::path::Path;
use async_std::prelude::*;
let path = Path::new("/laputa");
let mut dir = fs::read_dir(&path).await.unwrap();
while let Some(entry) = dir.next().await {
if let Ok(entry) = entry {
println!("{:?}", entry.path());
}
}
Cooperatively reschedule the current task on the executor
use async_std::prelude::*;
use async_std::task;
task::spawn(async {
let x = fibonnacci(1000); // Do expensive work
task::yield_now().await; // Allow other tasks to run
x + fibonnacci(100) // Do more work
})
Create an interval stream
use async_std::prelude::*;
use async_std::stream;
use std::time::Duration;
let mut interval = stream::interval(Duration::from_secs(4));
while let Some(_) = interval.next().await {
println!("prints every four seconds");
}
- Added
FutureExt
to theprelude
, allowing us to extendFuture
- Added
Stream::cmp
- Added
Stream::ge
- Added
Stream::last
- Added
Stream::le
- Added
Stream::lt
- Added
Stream::merge
as "unstable", replacingstream::join!
- Added
Stream::partial_cmp
- Added
Stream::take_while
- Added
Stream::try_fold
- Added
future::IntoFuture
as "unstable" - Added
io::BufRead::split
- Added
io::Write::write_fmt
- Added
print!
,println!
,eprint!
,eprintln!
macros as "unstable" - Added
process
as "unstable", re-exporting std types only for now - Added
std::net
re-exports to thenet
submodule - Added
std::path::PathBuf
with all associated methods - Added
std::path::Path
with all associated methods - Added
stream::ExactSizeStream
as "unstable" - Added
stream::FusedStream
as "unstable" - Added
stream::Product
- Added
stream::Sum
- Added
stream::from_fn
- Added
stream::interval
as "unstable" - Added
stream::repeat_with
- Added
task::spawn_blocking
as "unstable", replacingtask::blocking
- Added
task::yield_now
- Added
write!
andwriteln!
macros as "unstable" - Stabilized
future::join!
andfuture::try_join!
- Stabilized
future::timeout
- Stabilized
path
- Stabilized
task::ready!
- Fixed
BufWriter::into_inner
so it callsflush
before yielding - Refactored
io::BufWriter
internals - Refactored
net::ToSocketAddrs
internals - Removed Travis CI entirely
- Rewrote the README.md
- Stabilized
io::Cursor
- Switched bors over to use GitHub actions
- Updated the
io
documentation to match std'sio
docs - Updated the
task
documentation to match std'sthread
docs
- Removed the "unstable"
stream::join!
in favor ofStream::merge
- Removed the "unstable"
task::blocking
in favor oftask::spawn_blocking
0.99.9 - 2019-10-08
This patch upgrades our futures-rs
version, allowing us to build on the 1.39
beta. Additionally we've introduced map
and for_each
to Stream
. And we've
added about a dozen new FromStream
implementations for std
types, bringing
us up to par with std's FromIterator
implementations.
And finally we've added a new "unstable" task::blocking
function which can be
used to convert blocking code into async code using a threadpool. We've been
using this internally for a while now to async-std to power our fs
and
net::SocketAddr
implementations. With this patch userland code now finally has
access to this too.
Create a stream of tuples, and collect into a hashmap
let a = stream::once(1u8);
let b = stream::once(0u8);
let s = a.zip(b);
let map: HashMap<u8, u8> = s.collect().await;
assert_eq!(map.get(&1), Some(&0u8));
Spawn a blocking task on a dedicated threadpool
task::blocking(async {
println!("long-running task here");
}).await;
- Added
stream::Stream::map
- Added
stream::Stream::for_each
- Added
stream::Stream::try_for_each
- Added
task::blocking
as "unstable" - Added
FromStream
for allstd::{option, collections, result, string, sync}
types. - Added the
path
submodule as "unstable".
- Updated
futures-preview
to0.3.0-alpha.19
, allowing us to build onrustc 1.39.0-beta
. - As a consequence of this upgrade, all of our concrete stream implementations
now make use of
Stream::size_hint
to optimize internal allocations. - We now use GitHub Actions through actions-rs, in addition to Travis CI. We intend to fully switch in the near future.
- Fixed a bug introduced in 0.99.6 where Unix Domain Listeners would sometimes become unresponsive.
- Updated our
sync::Barrier
docs to match std. - Updated our
stream::FromStream
docs to match std'sFromIterator
.
0.99.8 - 2019-09-28
- Added README to examples directory.
- Added concurrency documentation to the futures submodule.
- Added
io::Read::take
method. - Added
io::Read::by_ref
method. - Added
io::Read::chain
method.
- Pin futures-preview to
0.3.0-alpha.18
, to avoid rustc upgrade problems. - Simplified extension traits using a macro.
- Use the
broadcast
module withstd::sync::Mutex
, reducing dependencies.
0.99.7 - 2019-09-26
- Added
future::join
macro as "unstable" - Added
future::select
macro as "unstable" - Added
future::try_join
macro as "unstable" - Added
future::try_select
macro as "unstable" - Added
io::BufWriter
struct - Added
stream::Extend
trait - Added
stream::Stream::chain
method - Added
stream::Stream::filter
method - Added
stream::Stream::inspect
method - Added
stream::Stream::skip_while
method - Added
stream::Stream::skip
method - Added
stream::Stream::step_by
method - Added
sync::Arc
struct from stdlib - Added
sync::Barrier
struct as "unstable" - Added
sync::Weak
struct from stdlib - Added
task::ready
macro as "unstable"
- Correctly marked the
pin
submodule as "unstable" in the docs - Updated tutorial to have certain functions suffixed with
_loop
io
traits are now re-exports of futures-rs types, allowing them to be implementedstream
traits are now re-exports of futures-rs types, allowing them to be implementedprelude::*
now needs to be in scope for functionsio
andstream
traits to work
0.99.6 - 2019-09-19
- Added
stream::Stream::collect
as "unstable" - Added
stream::Stream::enumerate
- Added
stream::Stream::fuse
- Added
stream::Stream::fold
- Added
stream::Stream::scan
- Added
stream::Stream::zip
- Added
stream::join
macro as "unstable" - Added
stream::DoubleEndedStream
as "unstable" - Added
stream::FromStream
trait as "unstable" - Added
stream::IntoStream
trait as "unstable" - Added
io::Cursor
as "unstable" - Added
io::BufRead::consume
method - Added
io::repeat
- Added
io::Slice
andio::SliceMut
- Added documentation for feature flags
- Added
pin
submodule as "unstable" - Added the ability to
collect
a stream ofResult<T, E>
s into aResult<impl FromStream<T>, E>
- Refactored the scheduling algorithm of our executor to use work stealing
- Refactored the network driver, removing 400 lines of code
- Removed the
Send
bound fromtask::block_on
- Removed
Unpin
bound fromimpl<T: futures::stream::Stream> Stream for T
0.99.5 - 2019-09-12
- Added tests for
io::timeout
- Added
io::BufRead::fill_buf
, anasync fn
counterpart topoll_fill_buf
- Added
fs::create_dir_all
- Added
future::timeout
, a free function to time out futures after a threshold - Added
io::prelude
- Added
net::ToSocketAddrs
, a non-blocking version of std'sToSocketAddrs
- Added
stream::Stream::all
- Added
stream::Stream::filter_map
- Added
stream::Stream::find_map
- Added
stream::Stream::find
- Added
stream::Stream::min_by
- Added
stream::Stream::nth
- Polished the text and examples of the tutorial
cargo fmt
on all examples- Simplified internals of
TcpStream::connect_to
- Modularized our CI setup, enabled a rustfmt fallback, and improved caching
- Reduced our dependency on the
futures-rs
crate, improving compilation times - Split
io::Read
,io::Write
,io::BufRead
, andstream::Stream
into multiple files fs::File
now flushes more often to prevent flushes duringseek
- Updated all dependencies
- Fixed a bug in the conversion of
File
into raw handle - Fixed compilation errors on the latest nightly
0.99.4 - 2019-08-21
- Many small changes in the book, mostly typos
- Documentation fixes correcting examples
- Now works with recent nightly with stabilised async/await (> 2019-08-21)
0.99.3 - 2019-08-16
- Initial beta release