2 个不稳定版本

0.2.1 2023 年 1 月 3 日
0.2.0 2023 年 1 月 2 日
0.1.5 2022 年 3 月 27 日

905并发

每月 下载 28

Apache-2.0

40KB
479

bombs

高效的单生产者多消费者通道类型。

有关详细信息,请参阅 crate 文档。


lib.rs:

Bombs,一大堆。

此 crate 提供单生产者多消费者通道类型,其中 Fuse 是生产者,而 Bomb 是消费者。

Fuse/Bomb 只能使用一次,而 MultiFuse/MultiBomb 可以重复使用,并在队列中存储通过通道发送的值。

对于非阻塞通道,请参阅 crate 级别类型。对于阻塞通道,请参阅 blocking 模块中的类型。

示例

如果您想向不同的线程发送“关闭程序”信号,以便每个线程在关闭之前都需要先清理,则可以向每个线程提供一个 Bomb<()>,并在爆炸后运行清理代码。

注意:此示例假设您的线程已经在某个事件循环中运行逻辑。建议使用 blocking 变体,而不是在循环中检查 exploded()

use std::thread;
use bombs::blocking::Bomb;

// Create a new fuse and bomb pair.
let (fuse, bomb) = Bomb::new();

// Clone `bomb` into thread.
let bomb_clone = bomb.clone();
thread::spawn(move || {
    loop {
        // Do some stuff...

        if let Some(_) = bomb_clone.exploded() {
            // Received close signal, break.

            // Clean up data values...

            break;
        }
    }
});

// Create another thread.
// Move original `bomb` into thread.
thread::spawn(move || {
    loop {
        // Do some other stuff...

        if let Some(_) = bomb.exploded() {
            // Received close signal, break.

            // Clean up data values...

            break;
        }
    }
});

// Do some different stuff...

// Send close signal.
let flame = fuse.light(());

// Wait for all inner threads to close safely (checked by `Bomb` drop).
flame.wait_for_extinguish();

// Now safely quit the program.

依赖关系

~0–26MB
~330K SLoC