gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:28:06 25 4
gpt4 key购买 nike

问题

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com