multithreading - 已经处理许多并发结果中的两个,优化 - 架构?算法?

标签 multithreading algorithm optimization concurrency

我正在通过 threading.Thread() 从十几个来源下载数据。我的案例的特殊属性是,当某些这样的源准备就绪时(不是任意两个,而是预定义的两个,成对的),数据处理就可以开始了。

第一种方法是下载所有源,然后

for all t in threads: t.join()

等到所有下载完成,然后开始数据处理,因为这样我就可以确保拥有数据处理所需的一切。

它已经很快了,但是数据处理只有在所有 源完成下载后才开始。现在如何获得最后一点优化?

我想知道是否有一种规范的 CS 方法可以解决输入收集仅部分完成时启动任务的问题。

谢谢!

最佳答案

在一般的 CS 术语中,您正在寻找的是支持任务组合的语言功能。

例如,在 C# 中,如果您使用 Task 而不是 Thread,您可以使用 Task.WhenAll() 来等待每一对要完成的子任务(作为 Task 本身),然后 ContinueWith 无论您需要对那对结果做什么。

参见 https://msdn.microsoft.com/en-us/library/hh194874(v=vs.110).aspx

    Task a = ...
    Task b = ...
    Task ab = Task.WhenAll(a,b).ContinueWith(...);
    ... 

    var result = Task.WhenAll(ab, ab, bc, ...).Result;

您还可以研究在许多编程语言中可用的 Reactive Extensions。这些使得能够在推送模型中组合可观察的结果序列。例如zip在 RxJS 中,只要它的两个输入序列都产生了结果,您就可以触发下一步。

关于multithreading - 已经处理许多并发结果中的两个,优化 - 架构?算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103718/

相关文章:

c - 等待 system() 调用完成

arrays - 如何在功能上而不是程序上在线性时间内 "invert"数组?

algorithm - 相邻边对的最小生成树

php - 优化大型 WordPress 网站

algorithm - 有没有办法遍历所有平衡位向量?

optimization - 如何使用 SSE2/SSE3/SSE4 处理 24 位 3 channel 彩色图像?

java - Java ThreadPool中ThreadLocal值是否被GC?

java - 这是否违反了 EJB 限制?

java - setTheme(R.style.MyTheme) 不适用于线程

java - 设置访问房间的迷宫解决回溯算法的问题