原文
import std.stdio;
import std.concurrency;
import std.algorithm;
import std.range;
import std.exception;
import std.format;
import core.thread;
struct Progress {
Tid tid;
size_t amount;
size_t total;
}
void display(Progress[Tid] progresses) {
const amount = progresses.byValue.map!(p => p.amount).sum;
const total = progresses.byValue.map!(p => p.total).sum;
writefln!"%6.2f%%"(100.0 * amount / total);
}
void download(string url) {
writefln!"%s线程下载了%s."(thisTid, url);
enum total = 20;
foreach (i; 0 .. total) {
Thread.sleep(100.msecs);
ownerTid.send(Progress(thisTid, i + 1, total));
}
}
void main() {
auto list = [ "dlang.org", "ddili.org" ];
auto downloaders = list.length.iota
.map!(i => spawnLinked(&download, list[i])).array;
Progress[Tid] progresses;
size_t finished = 0;
while (finished != list.length) {
receive(
(LinkTerminated arg) {
++finished;
enforce((arg.tid in progresses) &&
(progresses[arg.tid].amount == progresses[arg.tid].total),
format!"%s线程意外退出"(arg.tid));
},
(Progress progress) {
progresses[progress.tid] = progress;
progresses.display();
}
);
}
writeln("处理下载文件");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现