NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #63 most downloaded on crates.io
An event-driven, non-blocking I/O platform for writing asynchronous I/O backed applications.
Last release 5 days ago
03 Oct 2026
Ships fairly regularly
a new release about every 5 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
5 versions withdrawn
withdrawn after publishing
10 years old
197 releases · first in 2016
fs: handle integer overflow in buffered relative seek
AsyncFd registration list on deregister" (#8540)Permit before sending value (#8560)MAX_PERMITS in Semaphore::acquire (#8548)Sender::closed outside mutex (#8558)JoinSet (#8554)clear_entry (#8552)io_uring read length to u32::MAX (#8572)current_thread task dumps from other runtimes (#8544)io_uring context if a completion waker panics (#8566)One column per quarter.
signal: restore MSRV by removing OnceLock::wait from the Windows handler
fs: implement From<OwnedFd> and From<OwnedHandle> for File
From<OwnedFd> and From<OwnedHandle> for File (#8266)SocketAddr methods to Unix sockets (#8144)#[inline] to IO trait impls for in-memory types (#8242)mpsc::{Receiver,UnboundedReceiver} now drops waker on drop, even if there are still senders (#8095)#[track_caller] to timeout_at() (#8077)Sleep (#8132)Chain (#8251)FastRand (#8078)reserve[_many] returns permits (#8260)Trace::capture/Trace::trace_with (#8043).reset() (#8169)fs::try_exists (#8080)create_dir_all succeeds if path exists (#8149)try_read*/try_write* readiness behavior (#8032)yield_now defers its waker (#8254)timeout_at() (#8077)From<OwnedFd> and From<OwnedHandle> for File (#8266)SocketAddr methods to Unix sockets (#8144)#[inline] to IO trait impls for in-memory types (#8242)mpsc::{Receiver,UnboundedReceiver} now drops waker on drop, even if there are still senders (#8095)#[track_caller] to timeout_at() (#8077)Sleep (#8132)Chain (#8251)FastRand (#8078)reserve[_many] returns permits (#8260)Trace::capture/Trace::trace_with (#8043).reset() (#8169)fs::try_exists (#8080)create_dir_all succeeds if path exists (#8149)try_read*/try_write* readiness behavior (#8032)yield_now defers its waker (#8254)timeout_at() (#8077)runtime: don't skip the driver when before_park schedules work
sync: fix underflow in mpsc channel len()
This release reverts the LIFO slot stealing change introduced in 1.51.0 ([#7431]), due to [its performance impact][#8065]. ([#8100])
This release reverts the LIFO slot stealing change introduced in 1.51.0 ([#7431]), due to [its performance impact][#8065]. ([#8100])
runtime: revert [#7757] to fix [a regression][#8056] that causes spawn_blocking to hang ([#8057])
spawn_blocking to hang (#8057)io: AioSource::register_borrowed for I/O safety support ([#7992])
AioSource::register_borrowed for I/O safety support (#7992)try_io function to unix::pipe sender and receiver types (#8030)Builder::enable_eager_driver_handoff setting enable eager hand off of the I/O and time drivers before polling tasks (#8010)trace_with() for customized task dumps (#8025)impl FnMut() in trace_with instead of just fn() (#8040)io_uring in AsyncRead for File (#7907)spawn_blocking scalability with sharded queue (#7757)compare_exchange_weak() in worker queue (#8028)fs: handle integer overflow in buffered relative seek
AsyncFd registration list on deregister" (#8540)Permit before sending value (#8560)MAX_PERMITS in Semaphore::acquire (#8548)Sender::closed outside mutex (#8558)JoinSet (#8554)clear_entry (#8552)runtime: don't skip the driver when before_park schedules work
before_park schedules work (#8222)sync: fix underflow in mpsc channel len()
This release reverts the LIFO slot stealing change introduced in 1.51.0 ([#7431]), due to [its performance impact][#8065]. ([#8100])
This release reverts the LIFO slot stealing change introduced in 1.51.0 ([#7431]), due to its performance impact. (#8100)
sync: fix semaphore reopens after forget ([#8021])
net: implement get_peer_cred on Hurd ([#7989])
net: add TcpStream::set_zero_linger ([#7837])
memchr returns in-bounds pointer (#7792)write_buf (#7871)event_interval is set to 0 (#7838)SetConsoleCtrlHandler (#7833)Registry (#7885)AsyncFd registration list on deregister (#7773)use declarations in tokio::select! (#7929)GET_BUF_SIZE constant for target_os = "android" (#7889)current_thread if before_park defers waker (#7835)block_in_place (#7879)num_idle_threads on shutdown (#7910, #7918, #7922)AsyncWriteExt::shutdown() (#7908)AsyncWrite documentation (#7875)Runtime::spawn (#7803)event_interval doc (#7932)recv returns None once closed and no more messages (#7920)spawn_blocking vs dedicated threads (#7923)JoinHandle completion (#7825)None (#7869)Builder::spawn_local (#7828)net: deprecate {TcpStream,TcpSocket}::set_linger ([#7752])
TCLASS option on IPv6 (#7781)runtime::id::Id (#7125)Extend for JoinSet (#7195)LocalSet::id() (#7776){TcpStream,TcpSocket}::set_linger (#7752)join! and try_join! (#7766)TryRecvError::Disconnected from Receiver::try_recv after Receiver::close (#7686)Debug implementation (#7720)EINTR in fs::write for io-uring (#7786)tokio::fs::read (#7696)EPERM (#7724)bounded.rs and park.rs (#7817)SyncIoBridge cross-references to copy and copy_buf (#7798)AsyncWrite does not inherit from std::io::Write (#7705)num_alive_tasks is not strongly consistent (#7614)TcpStream::peek (#7305)unix::OwnedWriteHalf (#7742)TcpSocket docs (#7738)LocalRuntime in new_current_thread docs (#7820)mpsc::Sender::try_send docs (#7721)oneshot::Receiver (#7780)errors of mpsc (#7722)spawn_local usage on local runtime (#7689)fs: add File::max_buf_size ([#7594])
The MSRV is increased to 1.71.
File::max_buf_size (#7594)Chain of AsyncReadExt::chain (#7599)SocketAddr::as_abstract_name (#7491)TcpStream::quickack and TcpStream::set_quickack (#7490)AsRef<Self> for TcpStream and UnixStream (#7573)LocalKey::try_get (#7666)Ord for task::Id (#7530)max_buf_size when cloning a File (#7593)clippy::unwrap_in_result in #[tokio::main] (#7651)PollEvented noise from Debug formats (#7675)Command::spawn_with to use FnOnce (#7511)SetOnce (#7554)UnsafeCell::get_mut in Mutex::get_mut and RwLock::get_mut (#7569)Timeout<T>::poll (#7535)join! and try_join! (#7638)wake_by_ref() even if already woken (#7622)broadcast::Sender in broadcast::Sender::new() (#7629)RwLock::try_* methods (#7587)--cfg flags for taskdump and io_uring (#7655, #7621)io_uring in fs::write (#7567)io_uring with File::open() (#7617)io_uring with OpenOptions (#7321)local runtime flavor (#7375, #7597)AsyncRead::poll_read (#7580)AsyncFd readiness guards (#7583)UCred::pid() on Cygwin (#7611)set_reuseport() and reuseport() (#7628)SO_REUSEADDR is only set on Unix (#7533)Handle::block_on (#7665)Builder::global_queue_interval() (#7605)tokio::sync::watch::Receiver (#7584)SetOnce::wait (#7506)parking_lot feature flag (#7663)UnboundedSender::send (#7661)sync::watch (#7601)spawn_local methods (#7669)poll_proceed (#7586)sync: fix underflow in mpsc channel len()
sync: fix panic in Chan::recv_many when called with non-empty vector on closed channel ([#7991])
Chan::recv_many when called with non-empty vector on closed channel (#7991)sync: return TryRecvError::Disconnected from Receiver::try_recv after Receiver::close ([#7686])
TryRecvError::Disconnected from Receiver::try_recv after Receiver::close ([#7686])runtime: use release ordering in wake_by_ref() even if already woken ([#7622])
process: fix panic from spurious pidfd wakeup ([#7494])
asyncio.Event in SetOnce docs (#7485)This release adds poll_proceed and cooperative to the coop module for cooperative scheduling, adds SetOnce to the sync module which provides similar f
This release adds poll_proceed and cooperative to the coop module for
cooperative scheduling, adds SetOnce to the sync module which provides
similar functionality to [std::sync::OnceLock], and adds a new method
sync::Notify::notified_owned() which returns an OwnedNotified without
a lifetime parameter.
cooperative and poll_proceed (#7405)SetOnce (#7418)sync::Notify::notified_owned() (#7465)AtomicWaker::wake performance (#7450)This release fixes incorrect spawn locations in runtime task hooks for tasks spawned using tokio::spawn rather than Runtime::spawn. This issue only af
This release fixes incorrect spawn locations in runtime task hooks for tasks
spawned using tokio::spawn rather than Runtime::spawn. This issue only
affected the spawn location in TaskMeta::spawned_at, and did not affect task
locations in Tracing events.
TaskMeta::spawned_at tracking where a task was spawned
(#7440)net: fixed TcpStream::shutdown incorrectly returning an error on macOS ([#7290])
TcpStream::shutdown incorrectly returning an error on macOS (#7290)mpsc::OwnedPermit::{same_channel, same_channel_as_sender} methods (#7389)biased option for join! and try_join!, similar to select! (#7307)pipe::OpenOptions::read_write on Android (#7426)Clone implementation for net::unix::SocketAddr (#7422)queue::Local<T> (#7340)LocalSet::{poll,drop} (#7372)TaskMeta::spawn_location tracking where a task was spawned (#7417)LocalOptions parameter to runtime::Builder::build_local (#7346)start_seek is not used (#7366)AsyncWriteExt::flush (#7364)recv_buffer_size method (#7336)RawFd in TcpSocket docs (#7416)AsRawFd doc link to current Rust stdlib location (#7429)on_*_task_poll is unstable (#7311)time::advance (#7394)This fixes a regression on the wasm32-unknown-unknown target, where code that previously did not panic due to calls to Instant::now() started failing.
This fixes a regression on the wasm32-unknown-unknown target, where code that
previously did not panic due to calls to Instant::now() started failing. This
is due to the stabilization of the first time-based metric.
metrics: stabilize worker_total_busy_duration, worker_park_count, and worker_unpark_count ([#6899], [#7276])
worker_total_busy_duration, worker_park_count, and
worker_unpark_count (#6899, #7276)Command::spawn_with (#7249)Unpin for some trait impls (#7204)runtime::Handle as unwind safe (#7230)This release fixes a soundness issue in the broadcast channel. The channel accepts values that are Send but !Sync. Previously, the channel called clon
This release fixes a soundness issue in the broadcast channel. The channel
accepts values that are Send but !Sync. Previously, the channel called
clone() on these values without synchronizing. This release fixes the channel
by synchronizing calls to .clone() (Thanks Austin Bonander for finding and
reporting the issue).
clone() call in broadcast channel (#7232)rt: skip defer queue in block_in_place context ([#7216])
block_in_place context (#7216)We determined this change is not a breaking change as Tokio is not intended to operate using blocking sockets. Doing so results in runtime hangs and s…
This release changes the from_std method on sockets to panic if a blocking
socket is provided. We determined this change is not a breaking change as Tokio is not
intended to operate using blocking sockets. Doing so results in runtime hangs and
should be considered a bug. Accidentally passing a blocking socket to Tokio is one
of the most common user mistakes. If this change causes an issue for you, please
comment on #7172.
task::coop module (#7116)Command::get_kill_on_drop() (#7086)broadcast::Sender::closed (#6685, #7090)broadcast::WeakSender (#7100)oneshot::Receiver::is_empty() (#7153)oneshot::Receiver::is_terminated() (#7152)File should not start a background read (#7139)start_kill on exited child should not fail (#7160)CTRL_CLOSE, CTRL_LOGOFF, CTRL_SHUTDOWN on windows (#7122)select! budget-aware (#7164)from_std (#7166)select! alternatives (#7110)send_to (#7146)Child stdout (#7141)Child::kill behavior (#7162)ChildStdin struct doc comment (#7192)worker_threads instead of core_threads (#7186)sync: return TryRecvError::Disconnected from Receiver::try_recv after Receiver::close ([#7686])
TryRecvError::Disconnected from Receiver::try_recv after Receiver::close (#7686)runtime: use release ordering in wake_by_ref() even if already woken ([#7622])
process: fix panic from spurious pidfd wakeup ([#7494])
This release fixes a soundness issue in the broadcast channel. The channel accepts values that are Send but !Sync. Previously, the channel called clon
This release fixes a soundness issue in the broadcast channel. The channel
accepts values that are Send but !Sync. Previously, the channel called
clone() on these values without synchronizing. This release fixes the channel
by synchronizing calls to .clone() (Thanks Austin Bonander for finding and
reporting the issue).
clone() call in broadcast channel (#7232)net: add UdpSocket::peek methods ([#7068])
UdpSocket::peek methods (#7068)Command::into_std() (#7014)SignalKind::info on illumos (#6995)set_len before initializing vector in Blocking (#7054)clippy::needless_return in #[tokio::main] (#6874)unsync_load (#7073)Buf::put_bytes in Repeat read impl (#7055)This release fixes a soundness issue in the broadcast channel. The channel accepts values that are Send but !Sync. Previously, the channel called clon
This release fixes a soundness issue in the broadcast channel. The channel
accepts values that are Send but !Sync. Previously, the channel called
clone() on these values without synchronizing. This release fixes the channel
by synchronizing calls to .clone() (Thanks Austin Bonander for finding and
reporting the issue).
clone() call in broadcast channel (#7232)io: add AsyncFd::{try_io, try_io_mut} ([#6967])
metrics: fix bug with wrong number of buckets for the histogram ([#6957])
metrics: stabilize global_queue_depth ([#6854], [#6918])
global_queue_depth (#6854, #6918)SocketAddr (#6868)watch::Sender::sender_count (#6836)mpsc::Receiver::blocking_recv_many (#6867)Id apis (#6793, #6891)LocalRuntime (#6808)#[must_use] to Notified (#6828)watch cooperative (#6846)broadcast::Receiver cooperative (#6870)cfg_fs for wasi target (#6822)OwnedFd with AsyncFd (#6821)AsyncFd methods (#6890)join and try_join (#6814, #6841)TcpSocket::set_nodelay and TcpSocket::nodelay (#6840)io: add util::SimplexStream ([#6589])
util::SimplexStream (#6589)Command::process_group (#6731){TrySendError,SendTimeoutError}::into_inner (#6755)JoinSet::join_all (#6784)Builder::{on_task_spawn, on_task_terminate} (#6742)write_all_buf when possible (#6724)UnwindSafe (#6783)Sleep and BatchSemaphore instrumentation explicit roots (#6727)NonZeroU64 for task::Id (#6733)JoinError (#6753)#[must_use] to JoinHandle::abort_handle (#6762)This release fixes a regression where the unix socket api stopped accepting the abstract socket namespace. ([#6772])
This release fixes a regression where the unix socket api stopped accepting the abstract socket namespace. (#6772)
This release fixes a regression where the select! macro stopped accepting expressions that make use of temporary lifetime extension. ([#6722])
This release fixes a regression where the select! macro stopped accepting
expressions that make use of temporary lifetime extension. (#6722)
This release reverts "time: avoid traversing entries in the time wheel twice" because it contains a bug. ([#6715])
This release reverts "time: avoid traversing entries in the time wheel twice" because it contains a bug. (#6715)
Yanked. Please use 1.39.1 instead.
Yanked. Please use 1.39.1 instead.
AsyncSeek for Empty (#6663)num_alive_tasks (#6619, #6667)Command::as_std_mut (#6608)watch::Sender::same_channel (#6637){Receiver,UnboundedReceiver}::{sender_strong_count,sender_weak_count} (#6661)Default for watch::Sender (#6626)Clone for AbortHandle (#6621)consume_budget (#6622)ReadBuf::put_slice() (#6629)copy_bidirectional and copy (#6532)num_cpus with available_parallelism (#6709)block_on (#6692)IntoFuture with timeout (#6666)IntoFuture with join! and select! (#6710)Interval (#6612)unhandled_panic behavior for #[tokio::main] and #[tokio::test] (#6593)spawned_tasks_count (#6114)worker_park_unpark_count (#6696)This release fixes a soundness issue in the broadcast channel. The channel accepts values that are Send but !Sync. Previously, the channel called clon
This release fixes a soundness issue in the broadcast channel. The channel
accepts values that are Send but !Sync. Previously, the channel called
clone() on these values without synchronizing. This release fixes the channel
by synchronizing calls to .clone() (Thanks Austin Bonander for finding and
reporting the issue).
clone() call in broadcast channel (#7232)This release fixes the bug identified as ([#6682]), which caused timers not to fire when they should.
This release marks the beginning of stabilization for runtime metrics. It stabilizes RuntimeMetrics::worker_count. Future releases will continue to st
This release marks the beginning of stabilization for runtime metrics. It
stabilizes RuntimeMetrics::worker_count. Future releases will continue to
stabilize more metrics.
File::create_new (#6573)copy_bidirectional_with_sizes (#6500)AsyncBufRead for Join (#6449)Clone for NamedPipeInfo (#6586)Notify::notify_last (#6520)mpsc::Receiver::{capacity,max_capacity} (#6511)split method to the semaphore permit (#6472, #6478)tokio::task::join_set::Builder::spawn_blocking (#6578)#[tokio::test] append #[test] at the end of the attribute list (#6497)blocking_threads count (#6551)RuntimeMetrics::worker_count (#6556)lifo_slot in block_in_place (#6596)global_queue_interval is zero (#6445)Semaphore for task dumps (#6499)LocalKey::get work with Clone types (#6433)true_when field in TimerShared (#6563)Interval::poll_tick (#6487)is_empty on mpsc block boundaries (#6603)stdin documentation (#6581)ReadHalf::unsplit() documentation (#6498)select! (#6468)NamedPipeServer example (#6590)SemaphorePermit, OwnedSemaphorePermit (#6477)Barrier::wait is not cancel safe (#6494)watch::Sender::{subscribe,closed} (#6490)spawn_blocking tasks (#6571)LocalSet::run_until (#6599)fs: add set_max_buf_size to tokio::File ([#6411])
set_max_buf_size to tokio::fs::File (#6411)try_new and try_with_interest to AsyncFd (#6345)forget_permits method to semaphore (#6331)is_closed, is_empty, and len to mpsc receivers (#6348)rwlock() method to owned RwLock guards (#6418)Clone for watch::Sender (#6388)TaskLocalFuture::take_value (#6340)FromIterator for JoinSet (#6300)io::split use a mutex instead of a spinlock (#6403)AsyncBufReadExt::fill_buf (#6431)AsyncReadExt's primitive read functions (#6337)Runtime to #[tokio::main] (#6366)enter example deterministic (#6351)mpsc::Sender::downgrade with #[must_use] (#6326)const_new before new_with (#6392)io: implement AsyncWrite for Empty ([#6235])
tokio::io::Join (#6220)AsyncWrite for Empty (#6235)UnixSocket (#6290)TcpSocket (#6311){Receiver,UnboundedReceiver}::poll_recv_many (#6236)Sender::{try_,}reserve_many (#6205)watch::Receiver::mark_unchanged (#6252)JoinSet::try_join_next (#6280)copy cooperative (#6265)repeat and sink cooperative (#6254)This is a forward part of a change that was backported to 1.25.3.
This is a forward part of a change that was backported to 1.25.3.
tokio::runtime::io::registration::async_io (#6221)net: add Apple watchOS support ([#6176])
Sized requirements from AsyncReadExt.read_buf (#6169)Runtime unwind safe (#6189)--cfg docsrs work without net feature (#6166)unsync_load on miri (#6179)io: allow clear_readiness after io driver shutdown ([#6067])
io: mark Interest::add with #[must_use] ([#6037])
Interest::add with #[must_use] (#6037)watch::Receiver::wait_for (#6021)spawn_local source location (#5984)watch (#6018)tokio::fs::File (#5958)Interest::remove method (#5906)DuplexStream (#5985)?Sized bound to {MutexGuard,OwnedMutexGuard}::map (#5997)watch::Receiver::mark_unseen (#5962, #6014, #6017)watch::Sender::new (#5998)OnceCell::from_value (#5903)stats feature (#5952)Child::wait is cancel safe (#5977)Semaphore (#5939, #5956, #5978, #6031, #6032, #6050)broadcast capacity is a lower bound (#6042)const_new is not instrumented (#6002)mpsc::Sender::send (#5947)watch channel (#5954)This is a forward part of a change that was backported to 1.25.3.
This is a forward part of a change that was backported to 1.25.3.
tokio::runtime::io::registration::async_io (#6221)sync: fix potential quadratic behavior in broadcast::Receiver ([#5925])
io: delegate WriteHalf::poll_write_vectored ([#5914])
This release bumps the MSRV of Tokio to 1.63. ([#5887])
This release bumps the MSRV of Tokio to 1.63. (#5887)
--cfg mio_unsupported_force_poll_poll flag (#5881)const_new methods always available (#5885)broadcast::Sender::new (#5824)UCred for espidf (#5868)File::options() (#5869)Interval (#5878){ChildStd*}::into_owned_{fd, handle} (#5899)broadcast::send (#5820)AsyncReadExt::read_exact (#5863)Sleep as !Unpin in docs (#5916)raw_arg not showing up in docs (#5865)rt: fix nesting two block_in_place with a block_on between ([#5837])
block_in_place with a block_on between (#5837)Technically a breaking change, the Send implementation is removed from runtime::EnterGuard. This change fixes a bug and should not impact most users.
Technically a breaking change, the Send implementation is removed from
runtime::EnterGuard. This change fixes a bug and should not impact most users.
EnterGuard should not be Send (#5766)fs::read_dir (#5653)JoinSet (#5693)EnterGuard dropped incorrect order (#5772)File (#5803)broadcast::Receiver::blocking_recv (#5690)raw_arg method to Command (#5704)JoinSet::poll_join_next (#5721)deps: disable default features for mio ([#5728])
Your coding agent can read these notes before it upgrades. Set up the MCP server →