以下是我要解决的问题:
我(比方说)我在远程服务器上查询了100个不同的数据来源
我需要在收到数据后尽快处理这些数据(数据很快就会过时)
处理时间和查询时间不确定
我想最大化我在给定时间段内处理的数据量。约束只在我的本地程序和机器上(远程服务器非常有效,而不是我的关注)。
以下是天真的做法:
对于每个数据源:
对此来源的数据执行阻止查询
处理数据
显然,这不能解决我的问题,因为有很多停机时间(在每次查询期间,cpu都处于空闲状态)
这是一个更好的方法:
对于每个数据源 s_i :
对下一个数据源执行非阻塞查询( s_i + 1 )
等待收到 s_i 的数据(来自for循环的上一次运行)
检查数据是否太旧(比如说在5秒前收到)。如果太旧,请再次对 s_i 进行阻止查询
处理数据
这种方法更好一点,停机时间更短。 我还可以通过最多n个步骤而不是下一个步骤进行查询来改进此方法。我应该使用n足够低,以便在我处理它们时,查询的结果不会过时,但是足够高,以便几乎没有停机时间。
此方法仍不理想,因为如果在查询 s_i 之前收到 s_i + 1 的查询,我将等待处理 S_I
我目前的解决方案
我使用100个线程(每个数据源1个)。每个线程在无限循环中执行以下操作:
获取信号量 querySemaphore
启动阻止查询
获取互斥锁(锁定) processorTimeLock
处理数据
我认为这种方式更好,因为我不会不必要地阻止等待长查询。
如何改进?
这就是我一直在做的事情。但是,我有一种强烈的感觉,这不是最佳的,应该有一个更好的解决方案,这个问题感觉像一个常见的问题。 有人有想法吗?任何帮助非常感谢!