multithreading - 在执行之前检查异步任务依赖关系的设计模式

标签 multithreading asynchronous design-patterns language-agnostic

问题

考虑到许多异步加载的依赖项,我想仅在所有依赖项加载完成后才触发一些代码。作为一个简单的示例,请考虑以下伪代码:

bool firstLoaded = false, secondLoaded = false, thirdLoaded = false;

function loadResourceOne() {
    // Asynchronously, or in a new thread:
    HTTPDownload("one.txt");
    firstLoaded = true;
    if (secondLoaded && thirdLoaded) {
        allLoaded();
    }
}

function loadResourceTwo() {
    // Asynchronously, or in a new thread:
    HTTPDownload("two.txt");
    secondLoaded = true;
    if (firstLoaded && thirdLoaded) {
        allLoaded();
    }
}

function loadResourceThree() {
    // Asynchronously, or in a new thread:
    HTTPDownload("three.txt");
    thirdLoaded = true;
    if (firstLoaded && secondLoaded) {
        allLoaded();
    }
}

function allLoaded() {
    Log("Done!");
}

/* async */ loadResourceOne();
/* async */ loadResourceTwo();
/* async */ loadResourceThree();

我在寻找什么

我发现自己必须在不同的语言和不同的上下文中反复解决这个问题。然而,每次我发现自己使用该语言提供的工具来组合一些简单的解决方案时,例如将每个异步资源作为 JavaScript 中的 Promise 返回,然后使用 Promise.all() -- 或者在 Python 中将每个资源加载到其自己的线程中,然后使用 threads.join()

我正在尝试找到一种设计模式来解决一般情况下的这个问题。最佳解决方案应满足两个标准:

  1. 可以应用于任何支持异步操作的语言
  2. 最大限度地减少代码重复(请注意,在我的简单示例中,allLoaded(); 行重复了三次,并且其前面的 if 语句实际上是重复的,并且如果我需要第四个或第五个依赖项)
  3. 在加载所有资源时尽快运行最终回调 - 这一点希望是显而易见的,但诸如“每 5 秒检查所有资源是否已加载”之类的解决方案是 Not Acceptable <

我尝试翻阅四人帮的设计模式索引,但我突然想到的几个可能的线索模式名称结果证明是无关的。

最佳答案

您正在寻找Fork-Join pattern .

In parallel computing, the fork–join model is a way of setting up and executing parallel programs, such that execution branches off in parallel at designated points in the program, to "join" (merge) at a subsequent point and resume sequential execution. Parallel sections may fork recursively until a certain task granularity is reached. Fork–join can be considered a parallel design pattern...

实现将取决于语言,但您可以结合您选择的语言来搜索 fork-join。请注意,您不会在“四人帮”中找到异步模式。您可能需要一本专门针对多线程或并行计算的书。

关于multithreading - 在执行之前检查异步任务依赖关系的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47082228/

相关文章:

python - 如何防止 PyQt 对象从不同线程收集垃圾?

c# - 使用 Invoke 从另一个线程获取 tabControl SelectedTab

asynchronous - Windows Script Host 中是否可以异步调用 JavaScript 函数?

c# - 使用对象类型在模块之间传递信息

Java同步方法

java - 从 API 返回响应并在 API 级别执行一些其他操作

javascript - 在继续之前等待对象构造函数内的方法完成

node.js - Nodejs 异步等待函数 JSON

Java 策略模式——我可以在 Context 类中委托(delegate)策略实例化吗?

javascript - 我如何使用 JavaScript 创建此 API 并分解方法