Giter Club home page Giter Club logo

Comments (15)

laizy avatar laizy commented on August 26, 2024 4

实现了一个lock-free的版本供你们参考:https://github.com/laizy/waitgroup-rs

from async-wg.

jmjoy avatar jmjoy commented on August 26, 2024

有没有什么例子可以重现吗?

from async-wg.

nkbai avatar nkbai commented on August 26, 2024

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.

jmjoy avatar jmjoy commented on August 26, 2024

@nkbai 代码示例有吗?

from async-wg.

nkbai avatar nkbai commented on August 26, 2024

https://github.com/nkbai/learnrustbynats/blob/cd372bca278f37f250c39ce062f8d7cafcb4a488/bench/src/main.rs

from async-wg.

nkbai avatar nkbai commented on August 26, 2024

关键在main函数中,

from async-wg.

jmjoy avatar jmjoy commented on August 26, 2024

@nkbai 现在master的代码呢?

from async-wg.

nkbai avatar nkbai commented on August 26, 2024

我自己重新实现了一个简单的wait group,完全没有按照你的思路来,所以就没问题了

from async-wg.

laizy avatar laizy commented on August 26, 2024

闲逛无意间看了下源码,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.

jmjoy avatar jmjoy commented on August 26, 2024

@laizy 谢谢大佬指点。

from async-wg.

nkbai avatar nkbai commented on August 26, 2024

@laizy 你说的这个应该是完全不同的两个问题
至少我想的wait_group 是和golang中的类似的。

如果没有调用done,导致await不返回,这个就是api设计的效果。

https://gobyexample.com/waitgroups
这里是一个例子

看我理解的不对

from async-wg.

jmjoy avatar jmjoy commented on August 26, 2024

@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.

nkbai avatar nkbai commented on August 26, 2024

@jmjoy 👍
一个好的接口不容易抽象,crossbeam的WaitGroup接口更优雅一些。

from async-wg.

laizy avatar laizy commented on August 26, 2024

如果没有调用done,导致await不返回,这个就是api设计的效果。

错了,你需要好好理理这里的本质问题。即便是调用done,也一样会导致卡死。我上面的例子只是为了方便重现。

let fut = async move {
    wg.done().await;  // 这个await也可能因为其他wg同时调用done方法导致它没法拿到内部的锁而提前退出。
};
task::spawn(fut.race(other_future));

from async-wg.

nkbai avatar nkbai commented on August 26, 2024

什么情况下会同时调用done而导致无法拿到内部的锁呢?
现在0.1.2这个版本有不合理的地方,应该使用一个锁管理waker以及count。如果是这个问题,那已经在我修复的范围之内了:

如果count和waker不是同一把锁,会出现如下情况

  1. poll 发现 count 没有ready
  2. poll 被调度走
  3. done count-1,发现到0了
  4. done 尝试wake,发现没有必要,因为 poll正在执行.
  5. poll被调度回来
  6. poll继续,设置waker
  7. 但是没有任何人会wake他了.

from async-wg.

Related Issues (1)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.