1
0
mirror of https://github.com/fafhrd91/actix-net synced 2024-11-23 20:51:06 +01:00

Change with_tokio_rt to accept Arc<Runtime>.

This allows to share tokio runtimes across different sub-systems
inside your application.

Signed-off-by: Gerd Zellweger <mail@gerdzellweger.com>
This commit is contained in:
Gerd Zellweger 2024-09-04 15:08:47 -07:00
parent cfae737314
commit 192d0661e9
6 changed files with 22 additions and 10 deletions

View File

@ -10,6 +10,7 @@ fn main() {
.worker_threads(2)
.enable_all()
.build()
.map(std::sync::Arc::new)
.unwrap()
})
.block_on(async_main());

View File

@ -109,7 +109,7 @@ impl Arbiter {
#[cfg(not(all(target_os = "linux", feature = "io-uring")))]
pub fn with_tokio_rt<F>(runtime_factory: F) -> Arbiter
where
F: FnOnce() -> tokio::runtime::Runtime + Send + 'static,
F: FnOnce() -> std::sync::Arc<tokio::runtime::Runtime> + Send + 'static,
{
let sys = System::current();
let system_id = sys.id();

View File

@ -1,5 +1,4 @@
use std::{future::Future, io};
use std::{sync::Arc, future::Future, io};
use tokio::task::{JoinHandle, LocalSet};
/// A Tokio-based runtime proxy.
@ -9,14 +8,14 @@ use tokio::task::{JoinHandle, LocalSet};
#[derive(Debug)]
pub struct Runtime {
local: LocalSet,
rt: tokio::runtime::Runtime,
rt: Arc<tokio::runtime::Runtime>,
}
pub(crate) fn default_tokio_runtime() -> io::Result<tokio::runtime::Runtime> {
pub(crate) fn default_tokio_runtime() -> io::Result<Arc<tokio::runtime::Runtime>> {
tokio::runtime::Builder::new_current_thread()
.enable_io()
.enable_time()
.build()
.build().map(Arc::new)
}
impl Runtime {
@ -141,6 +140,15 @@ impl Runtime {
impl From<tokio::runtime::Runtime> for Runtime {
fn from(rt: tokio::runtime::Runtime) -> Self {
Self {
local: LocalSet::new(),
rt: Arc::new(rt),
}
}
}
impl From<Arc<tokio::runtime::Runtime>> for Runtime {
fn from(rt: Arc<tokio::runtime::Runtime>) -> Self {
Self {
local: LocalSet::new(),
rt,

View File

@ -5,9 +5,9 @@ use std::{
io,
pin::Pin,
sync::atomic::{AtomicUsize, Ordering},
sync::Arc,
task::{Context, Poll},
};
use futures_core::ready;
use tokio::sync::{mpsc, oneshot};
@ -48,7 +48,7 @@ impl System {
/// [tokio-runtime]: tokio::runtime::Runtime
pub fn with_tokio_rt<F>(runtime_factory: F) -> SystemRunner
where
F: FnOnce() -> tokio::runtime::Runtime,
F: FnOnce() -> Arc<tokio::runtime::Runtime>,
{
let (stop_tx, stop_rx) = oneshot::channel();
let (sys_tx, sys_rx) = mpsc::unbounded_channel();
@ -87,7 +87,7 @@ impl System {
#[doc(hidden)]
pub fn with_tokio_rt<F>(_: F) -> SystemRunner
where
F: FnOnce() -> tokio::runtime::Runtime,
F: FnOnce() -> Arc<tokio::runtime::Runtime>,
{
unimplemented!("System::with_tokio_rt is not implemented for io-uring feature yet")
}

View File

@ -6,7 +6,7 @@ use std::{
use actix_rt::{task::JoinError, Arbiter, System};
#[cfg(not(feature = "io-uring"))]
use {
std::{sync::mpsc::channel, thread},
std::{sync::Arc, sync::mpsc::channel, thread},
tokio::sync::oneshot,
};
@ -250,6 +250,7 @@ fn new_system_with_tokio() {
.on_thread_start(|| {})
.on_thread_stop(|| {})
.build()
.map(Arc::new)
.unwrap()
})
.block_on(async {
@ -282,6 +283,7 @@ fn new_arbiter_with_tokio() {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.map(Arc::new)
.unwrap()
});

View File

@ -426,6 +426,7 @@ impl ServerWorker {
.enable_all()
.max_blocking_threads(config.max_blocking_threads)
.build()
.map(Arc::new)
.unwrap()
})
};