Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 54371c2

Browse files
authored
Merge pull request #510 from stjepang/fix-spawn-blocking
Improve thread startup/shutdown algorithm in spawn_blocking
2 parents 9ad0cf9 + 1a50ffd commit 54371c2

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

‎src/task/spawn_blocking.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crossbeam_channel::{unbounded, Receiver, Sender};
66
use once_cell::sync::Lazy;
77

88
use crate::task::{JoinHandle, Task};
9-
use crate::utils::{abort_on_panic, random};
9+
use crate::utils::abort_on_panic;
1010

1111
/// Spawns a blocking task.
1212
///
@@ -68,16 +68,13 @@ static POOL: Lazy<Pool> = Lazy::new(|| {
6868

6969
fn start_thread() {
7070
SLEEPING.fetch_add(1, Ordering::SeqCst);
71-
72-
// Generate a random duration of time between 1 second and 10 seconds. If the thread doesn't
73-
// receive the next task in this duration of time, it will stop running.
74-
let timeout = Duration::from_millis(1000 + u64::from(random(9_000)));
71+
let timeout = Duration::from_secs(1);
7572

7673
thread::Builder::new()
7774
.name("async-std/blocking".to_string())
7875
.spawn(move || {
7976
loop {
80-
let task = match POOL.receiver.recv_timeout(timeout) {
77+
let muttask = match POOL.receiver.recv_timeout(timeout) {
8178
Ok(task) => task,
8279
Err(_) => {
8380
// Check whether this is the last sleeping thread.
@@ -100,8 +97,22 @@ fn start_thread() {
10097
start_thread();
10198
}
10299

103-
// Run the task.
104-
abort_on_panic(|| task.run());
100+
loop {
101+
// Run the task.
102+
abort_on_panic(|| task.run());
103+
104+
// Try taking another task if there are any available.
105+
task = match POOL.receiver.try_recv() {
106+
Ok(task) => task,
107+
Err(_) => break,
108+
};
109+
}
110+
111+
// If there is at least one sleeping thread, stop this thread instead of putting it
112+
// to sleep.
113+
if SLEEPING.load(Ordering::SeqCst) > 0 {
114+
return;
115+
}
105116

106117
SLEEPING.fetch_add(1, Ordering::SeqCst);
107118
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /