From 77a52ea0fe645ecde198bbd7abb76c0dc62186ff Mon Sep 17 00:00:00 2001 From: ghassmo Date: Wed, 9 Mar 2022 17:47:59 +0400 Subject: [PATCH] bin/ircd: run four executor threads --- Cargo.lock | 1 + bin/ircd/Cargo.toml | 1 + bin/ircd/src/main.rs | 32 ++++++++++++++++++++++++++------ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4f638c7a..e9642782b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2653,6 +2653,7 @@ dependencies = [ "async-trait", "clap 3.0.7", "darkfi", + "easy-parallel", "futures", "log", "rand 0.8.5", diff --git a/bin/ircd/Cargo.toml b/bin/ircd/Cargo.toml index c7de1ca13..24e0d183e 100644 --- a/bin/ircd/Cargo.toml +++ b/bin/ircd/Cargo.toml @@ -15,6 +15,7 @@ async-std = "1.10.0" async-trait = "0.1.52" async-channel = "1.6.1" async-executor = "1.4.1" +easy-parallel = "3.2.0" # Crypto rand = "0.8.4" diff --git a/bin/ircd/src/main.rs b/bin/ircd/src/main.rs index c023dd4c3..a5a79c875 100644 --- a/bin/ircd/src/main.rs +++ b/bin/ircd/src/main.rs @@ -1,16 +1,18 @@ +use async_std::io::BufReader; +use std::{ + net::{SocketAddr, TcpListener, TcpStream}, + sync::Arc, +}; + extern crate clap; use async_executor::Executor; -use async_std::io::BufReader; use async_trait::async_trait; +use easy_parallel::Parallel; use futures::{AsyncBufReadExt, AsyncReadExt, FutureExt}; use log::{debug, error, info, warn}; use serde_json::{json, Value}; use simplelog::{ColorChoice, TermLogger, TerminalMode}; use smol::Async; -use std::{ - net::{SocketAddr, TcpListener, TcpStream}, - sync::Arc, -}; use darkfi::{ net, @@ -236,5 +238,23 @@ fn main() -> Result<()> { TermLogger::init(lvl, cfg, TerminalMode::Mixed, ColorChoice::Auto)?; let ex = Arc::new(Executor::new()); - smol::block_on(ex.run(start(ex.clone(), options))) + let (signal, shutdown) = async_channel::unbounded::<()>(); + + let ex2 = ex.clone(); + + // let nthreads = num_cpus::get(); + // debug!(target: "IRC DAEMON", "Run {} executor threads", nthreads); + + let (_, result) = Parallel::new() + .each(0..4, |_| smol::future::block_on(ex.run(shutdown.recv()))) + // Run the main future on the current thread. + .finish(|| { + smol::future::block_on(async move { + start(ex2.clone(), options).await?; + drop(signal); + Ok::<(), darkfi::Error>(()) + }) + }); + + result }