我正在通过 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/