Comments (15)
实现了一个lock-free的版本供你们参考:https://github.com/laizy/waitgroup-rs
from async-wg.
有没有什么例子可以重现吗?
from async-wg.
start_wg2 wait group polled.
start_wg2 wait group polled.
start_wg2 all done
start_wg2 wait group polled.
这就一个精简的例子啊, 这个await没有返回,关于wait group的调用日志是这个
from async-wg.
@nkbai 代码示例有吗?
from async-wg.
from async-wg.
关键在main函数中,
from async-wg.
@nkbai 现在master的代码呢?
from async-wg.
我自己重新实现了一个简单的wait group,完全没有按照你的思路来,所以就没问题了
from async-wg.
闲逛无意间看了下源码,api没设计好。其中的一点是没借用RIIA,这很可能也是导致上面的代码失败的原因。
需要注意的是:aysnc函数可以在任何一个await点提前终止。 下面是一个简单的例子导致程序卡死:
use async_std::prelude::*;
use async_std::task;
use async_wg::WaitGroup;
use std::time::Duration;
fn main() {
task::block_on( async {
let wg = WaitGroup::new();
for _ in 0..10isize {
let mut wg = wg.clone();
// Add count n.
wg.add(1isize).await;
let fut = async move {
println!("sleeping");
task::sleep(Duration::from_secs(4)).await; // 到这个await可以退出
println!("never printed"); // 这里不执行,不会打印
wg.done().await; // 这里也就不会调用
};
task::spawn(fut.race(task::sleep(Duration::from_secs(1)))); // 等待1秒钟结束,比上面的fut更早结束, 如果改成大于4秒的话,就能正常结束。
}
// Wait for done count is equal to add count.
wg.await;
});
}
当然 PR #2 重写的实现由于api没变自然也一样会有这种问题。
from async-wg.
@laizy 谢谢大佬指点。
from async-wg.
@laizy 你说的这个应该是完全不同的两个问题
至少我想的wait_group 是和golang中的类似的。
如果没有调用done,导致await不返回,这个就是api设计的效果。
https://gobyexample.com/waitgroups
这里是一个例子
看我理解的不对
from async-wg.
@laizy 你说的这个应该是完全不同的两个问题
至少我想的wait_group 是和golang中的类似的。如果没有调用done,导致await不返回,这个就是api设计的效果。
https://gobyexample.com/waitgroups
这里是一个例子看我理解的不对
@nkbai Golang必须要defer确保Done执行了,Rust则需要在drop里面确定Done,这样的话,async/await就没法用了,参考crossbeam的WaitGroup。
我在想这个库是不是得archive掉。
from async-wg.
@jmjoy 👍
一个好的接口不容易抽象,crossbeam的WaitGroup接口更优雅一些。
from async-wg.
如果没有调用done,导致await不返回,这个就是api设计的效果。
错了,你需要好好理理这里的本质问题。即便是调用done,也一样会导致卡死。我上面的例子只是为了方便重现。
let fut = async move {
wg.done().await; // 这个await也可能因为其他wg同时调用done方法导致它没法拿到内部的锁而提前退出。
};
task::spawn(fut.race(other_future));
from async-wg.
什么情况下会同时调用done而导致无法拿到内部的锁呢?
现在0.1.2这个版本有不合理的地方,应该使用一个锁管理waker以及count。如果是这个问题,那已经在我修复的范围之内了:
如果count和waker不是同一把锁,会出现如下情况
- poll 发现 count 没有ready
- poll 被调度走
- done count-1,发现到0了
- done 尝试wake,发现没有必要,因为 poll正在执行.
- poll被调度回来
- poll继续,设置waker
- 但是没有任何人会wake他了.
from async-wg.
Related Issues (1)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from async-wg.