Changelog History
Page 3
-
v1.1.0 Changes
November 21, 2019⏱ This patch introduces a faster scheduler algorithm,
Stream::throttle, and stabilizestask::yield_now. Additionally we're introducing several more stream APIs, bringing us to almost complete parity with the standard library.Furthermore our
pathsubmodule 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.Examples
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
- ➕ Added
Stream::throttleas "unstable". - ➕ Added
Stream::countas "unstable". - ➕ Added
Stream::maxas "unstable". - ➕ Added
Stream::successorsas "unstable". - ➕ Added
Stream::by_refas "unstable". - ➕ Added
Stream::partitionas "unstable". - ➕ Added contextual errors to the
pathsubmodule. - ➕ Added
os::windows::symlink_diras "unstable". - ➕ Added
os::windows::symlink_fileas "unstable". - Stabilized
task::yield_now.
🛠 Fixes
- 👀 We now ignore seek errors when rolling back failed
readcalls onFile. - Fixed a bug where
Stream::max_by_keywas returning the wrong result. - Fixed a bug where
Stream::min_by_keywas returning the wrong result.
🔄 Changed
- 🛠 Applied various fixes to the tutorial.
- 🛠 Fixed an issue with Clippy.
- ⚡️ Optimized an internal code generation macro, improving compilation speeds.
- ✂ Removed an
Unpinbound fromstream::Once. - ✂ Removed various extra internal uses of
pin_mut!. - Simplified
Stream::anyandStream::all's internals. - The
surfexample is now enabled again. - 👉 Tweaked some streams internals.
- ⚡️ Updated
futures-timerto 2.0.0, improving compilation speed. - ⬆️ Upgraded
async-macrosto 2.0.0. - 🚤
Stream::mergenow 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
channeltypes to link back to thechannelfunction.
- ➕ Added
-
v1.0.1 Changes
November 12, 2019🐎 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.
🔄 Changes
- 👌 Improved thread startup/shutdown algorithm in
task::spawn_blocking. - 🛠 Fixed a typo in the tutorial.
- 👌 Improved thread startup/shutdown algorithm in
-
v1.0.0 Changes
November 11, 2019🚀 This release marks the
1.0.0release 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 themajornumber.We're excited we've hit this milestone together with you all. Thank you!
➕ Added
- ➕ Added
Future::joinas "unstable", replacingfuture::join!. - Added
Future::try_joinas "unstable", replacingfuture::try_join!. - ✅ Enabled
stableandbetachannel testing on CI. - Implemented
FromIteratorandExtendforPathBuf. - Implemented
FromStreamforPathBuf. - Loosened the trait bounds of
io::copyon "unstable".
🔄 Changed
- ➕ Added a
Syncbound toRwLock, resolving a memory safety issue. - 🛠 Fixed a bug in
Stream::take_whilewhere it could continue after it should've ended. - 🛠 Fixed a bug where our
attributesCargo 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
futuresubmodule. - Various quality of life improvements to the
pathsubmodule. - Various quality of life improvements to the
streamsubmodule.
✂ Removed
- ✂ Removed
future::join!in favor ofFuture::join. - Removed
future::try_join!in favor ofFuture::try_join.
- ➕ Added
-
v0.99.12 Changes
November 07, 2019⬆️ This patch upgrades us to
futures0.3, support forasync/awaiton Rust 📚 Stable, performance improvements, and brand new module-level documentation.➕ Added
- ➕ Added
Future::flattenas "unstable". - ➕ Added
Future::raceas "unstable" (replacesfuture::select!). - Added
Future::try_raceas "unstable" (replacesfuture::try_select!). - ➕ Added
Stderr::lockas "unstable". - ➕ Added
Stdin::lockas "unstable". - ➕ Added
Stdout::lockas "unstable". - ➕ Added
Stream::copiedas "unstable". - ➕ Added
Stream::eqas "unstable". - Added
Stream::max_by_keyas "unstable". - ➕ Added
Stream::minas "unstable". - ➕ Added
Stream::neas "unstable". - ➕ Added
Stream::positionas "unstable". - ➕ Added
StreamExtandFutureExtas enumerable in theprelude. - ➕ Added
TcpListenerandTcpStreamintegration tests. - ➕ Added
stream::from_iter. - ➕ Added
sync::WakerSetfor internal use. - ➕ Added an example to handle both
IP v4andIP v6connections. - ➕ Added the
defaultCargo feature. - ➕ Added the
attributesCargo feature. - ➕ Added the
stdCargo feature.
🔄 Changed
- 🛠 Fixed a bug in the blocking threadpool where it didn't spawn more than one thread.
- 🛠 Fixed a bug with
Stream::mergewhere sometimes it ended too soon. - 🛠 Fixed a bug with our GitHub actions setup.
- 🛠 Fixed an issue where our channels could spuriously deadlock.
- 🔨 Refactored the
taskmodule. - ✂ Removed a deprecated GitHub action.
- Replaced
futures-previewwithfutures. - Replaced
lazy_staticwithonce_cell. - Replaced all uses of
VecDequeuein the examples withstream::from_iter. - 🔀 Simplified
sync::RwLockusing the internalsync::WakerSettype. - 📚 Updated the
pathsubmodule documentation to match std. - 📚 Updated the mod-level documentation to match std.
✂ Removed
- ✂ Removed
future::select!(replaced byFuture::race). - Removed
future::try_select!(replaced byFuture::try_race).
- ➕ Added
-
v0.99.11 Changes
October 29, 2019🔀 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.
Examples
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
- ➕ Added
Future::delayas "unstable" - ➕ Added
Stream::flat_mapas "unstable" - ➕ Added
Stream::flattenas "unstable" - ➕ Added
Stream::productas "unstable" - ➕ Added
Stream::sumas "unstable" - Added
Stream::min_by_key - ➕ Added
Stream::max_by - ➕ Added
Stream::timeoutas "unstable" - ➕ Added
sync::channelas "unstable". - ➕ Added doc links from instantiated structs to the methods that create them.
- Implemented
Extend+FromStreamforPathBuf.
🔄 Changed
- 🛠 Fixed an issue with
block_onso it works even when nested. - 🛠 Fixed issues with our Clippy check on CI.
- Replaced our uses of
cfg_ifwith our own macros, simplifying the codebase. - ⚡️ Updated the homepage link in
Cargo.tomlto point to async.rs. - 📚 Updated the module-level documentation for
streamandsync. - ✏️ Various typos and grammar fixes.
- ✂ Removed redundant file flushes, improving the performance of
Fileoperations
✂ Removed
🚀 Nothing was removed in this release.
- ➕ Added
-
v0.99.10 Changes
October 16, 2019This patch stabilizes several core concurrency macros, introduces async versions of
PathandPathBuf, and adds almost 100 other commits.Examples
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
- ➕ Added
FutureExtto theprelude, allowing us to extendFuture - ➕ Added
Stream::cmp - ➕ Added
Stream::ge - ➕ Added
Stream::last - ➕ Added
Stream::le - ➕ Added
Stream::lt - ➕ Added
Stream::mergeas "unstable", replacingstream::join! - ➕ Added
Stream::partial_cmp - ➕ Added
Stream::take_while - ➕ Added
Stream::try_fold - ➕ Added
future::IntoFutureas "unstable" - ➕ Added
io::BufRead::split - ➕ Added
io::Write::write_fmt - ➕ Added
print!,println!,eprint!,eprintln!macros as "unstable" - ➕ Added
processas "unstable", re-exporting std types only for now - ➕ Added
std::netre-exports to thenetsubmodule - ➕ Added
std::path::PathBufwith all associated methods - ➕ Added
std::path::Pathwith all associated methods - ➕ Added
stream::ExactSizeStreamas "unstable" - ➕ Added
stream::FusedStreamas "unstable" - ➕ Added
stream::Product - ➕ Added
stream::Sum - ➕ Added
stream::from_fn - ➕ Added
stream::intervalas "unstable" - ➕ Added
stream::repeat_with - ➕ Added
task::spawn_blockingas "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!
🔄 Changed
- 🛠 Fixed
BufWriter::into_innerso it callsflushbefore yielding - 🔨 Refactored
io::BufWriterinternals - 🔨 Refactored
net::ToSocketAddrsinternals - ✂ Removed Travis CI entirely
- Rewrote the README.md
- Stabilized
io::Cursor - Switched bors over to use GitHub actions
- 📚 Updated the
iodocumentation to match std'siodocs - 📚 Updated the
taskdocumentation to match std'sthreaddocs
✂ Removed
- ✂ Removed the "unstable"
stream::join!in favor ofStream::merge - ✂ Removed the "unstable"
task::blockingin favor oftask::spawn_blocking
- ➕ Added
-
v0.99.9 Changes
October 08, 2019⬆️ This patch upgrades our
futures-rsversion, allowing us to build on the 1.39 beta. Additionally we've introducedmapandfor_eachtoStream. And we've ➕ added about a dozen newFromStreamimplementations forstdtypes, bringing us up to par with std'sFromIteratorimplementations.And finally we've added a new "unstable"
task::blockingfunction 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 ourfsandnet::SocketAddrimplementations. With this patch userland code now finally has access to this too.Example
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
- ➕ Added
stream::Stream::map - ➕ Added
stream::Stream::for_each - Added
stream::Stream::try_for_each - ➕ Added
task::blockingas "unstable" - ➕ Added
FromStreamfor allstd::{option, collections, result, string, sync}types. - ➕ Added the
pathsubmodule as "unstable".
🔄 Changed
- ⚡️ Updated
futures-previewto0.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_hintto 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::Barrierdocs to match std. - ⚡️ Updated our
stream::FromStreamdocs to match std'sFromIterator.
- ➕ Added
-
v0.99.8 Changes
September 28, 2019➕ Added
- ➕ Added README to examples directory.
- ➕ Added concurrency documentation to the futures submodule.
- ➕ Added
io::Read::takemethod. - ➕ Added
io::Read::by_refmethod. - ➕ Added
io::Read::chainmethod.
🔄 Changed
- ⬆️ Pin futures-preview to
0.3.0-alpha.18, to avoid rustc upgrade problems. - Simplified extension traits using a macro.
- 🔀 Use the
broadcastmodule withstd::sync::Mutex, reducing dependencies.
-
v0.99.7 Changes
September 26, 2019➕ Added
- ➕ Added
future::joinmacro as "unstable" - ➕ Added
future::selectmacro as "unstable" - ➕ Added
future::try_joinmacro as "unstable" - ➕ Added
future::try_selectmacro as "unstable" - ➕ Added
io::BufWriterstruct - ➕ Added
stream::Extendtrait - ➕ Added
stream::Stream::chainmethod - ➕ Added
stream::Stream::filtermethod - ➕ Added
stream::Stream::inspectmethod - ➕ Added
stream::Stream::skip_whilemethod - ➕ Added
stream::Stream::skipmethod - ➕ Added
stream::Stream::step_bymethod - ➕ Added
sync::Arcstruct from stdlib - ➕ Added
sync::Barrierstruct as "unstable" - ➕ Added
sync::Weakstruct from stdlib - ➕ Added
task::readymacro as "unstable"
🔄 Changed
- 📌 Correctly marked the
pinsubmodule as "unstable" in the docs - ⚡️ Updated tutorial to have certain functions suffixed with
_loop iotraits are now re-exports of futures-rs types, allowing them to be implementedstreamtraits are now re-exports of futures-rs types, allowing them to be implementedprelude::*now needs to be in scope for functionsioandstreamtraits to work
- ➕ Added
-
v0.99.6 Changes
September 19, 2019➕ Added
- ➕ Added
stream::Stream::collectas "unstable" - ➕ Added
stream::Stream::enumerate - ➕ Added
stream::Stream::fuse - ➕ Added
stream::Stream::fold - ➕ Added
stream::Stream::scan - ➕ Added
stream::Stream::zip - ➕ Added
stream::joinmacro as "unstable" - ➕ Added
stream::DoubleEndedStreamas "unstable" - ➕ Added
stream::FromStreamtrait as "unstable" - ➕ Added
stream::IntoStreamtrait as "unstable" - ➕ Added
io::Cursoras "unstable" - ➕ Added
io::BufRead::consumemethod - ➕ Added
io::repeat - ➕ Added
io::Sliceandio::SliceMut - ➕ Added documentation for feature flags
- ➕ Added
pinsubmodule as "unstable" - ➕ Added the ability to
collecta stream ofResult<T, E>s into aResult<impl FromStream<T>, E>
🔄 Changed
- 🔨 Refactored the scheduling algorithm of our executor to use work stealing
- 🔨 Refactored the network driver, removing 400 lines of code
- ✂ Removed the
Sendbound fromtask::block_on - ✂ Removed
Unpinbound fromimpl<T: futures::stream::Stream> Stream for T
- ➕ Added