【问题标题】:multithreading in D with for loopD中的多线程与for循环
【发布时间】:2013-02-24 21:17:50
【问题描述】:

我知道 Rust 可以使用轻量级线程运行循环。比如:

use task::spawn;

fn main() {
  for 100.times {
    do spawn {
      io::println("Hello");
    }
  }

我如何在 D 中做到这一点?

【问题讨论】:

    标签: multithreading d rust


    【解决方案1】:

    相关 API 文档:std.parallelism

    以下是完成示例的几种方法:

    并行foreach,使用TaskPool的parallel

    foreach (i, val; taskPool.parallel(new int[50])) {
        writeln("Hello:", i);
    }
    

    常规foreach,使用put将任务添加到任务池:

    foreach (i; 0 .. 50) {
        auto t = task!writeln("Hello:", i);
        taskPool.put(t);
    }
    

    new thread 而不是 TaskPool 中执行每个任务:

    foreach (i; 0 .. 50) {
        auto t = task!writeln("Hello:", i);
        t.executeInNewThread();
    }
    

    Rust 的运行时有一个内置的任务调度程序,但是对于 D,这是作为一个库来实现的。话虽如此,第二个在功能方面最接近,最后一个在语法方面最接近(但它们是操作系统线程,不是轻量级的)。

    在 D 中,轻量级线程由程序员明确控制。 TaskPool 类似于 Rust/Go 中的调度程序,但它为程序员提供了更细粒度的控制。这使它稍微冗长一些,但它也为您提供了mapreduceforeach 等的并行版本。这使得更容易有效地表示更复杂的算法。

    运行每个示例应该会给您预期的结果:乱序写入。

    注意:

    来自文档:

    此池中的工作线程是守护线程,这意味着在终止主线程之前无需调用 TaskPool.stop 或 TaskPool.finish。

    第二个示例不会等到所有工作人员都完成后,因此在测试中您可能不会得到任何结果(当 main 完成时,所有剩余的任务都被杀死)。您可能需要通过调用finish 来阻止:

    taskPool.finish(true);
    

    【讨论】:

    • 我可以这样做吗:for (int i=0; i
    • @Suliman - 你对语法有疑问吗?因为这几乎正是前两个所做的(第二个更是如此)。你必须使用 taskPool 对象,因为 D 不会为你做。
    • 在这种情况下没有。 D 不会为您安排轻量级线程,因此您必须使用库。第二个例子是最接近的。
    【解决方案2】:

    D 没有针对轻量级线程的内置抽象。相反,您可以:

    • 使用线程(参见std.concurrencystd.parallelism
    • 使用fibers,并通过显式让步执行手动执行多任务
    • 使用诸如 Vibe.d 之类的库,该库使用纤程实现异步 I/O,并在阻塞操作上隐式让步

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 2013-11-07
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多