0

我每天晚上都有一个流程运行,并为一组公司进行大量数据分析。我只是在贯穿 company list 的 for 循环中执行此操作。有时完成此过程大约需要 1 小时。有时会导致一些错误,它会在导致 . 我必须手动重新启动它,它会处理所有剩余的公司分析。

由于每个 for 循环运行都是一个单独的公司的数据分析,所以 for 循环内的多线程应该是一个好的解决方案吗?

感谢您的任何建议。

4

3 回答 3

4

ThreadPoolExecutor是你的朋友!

于 2012-09-22T01:39:15.910 回答
2

由于每个 for 循环运行都是一个单独的公司的数据分析,所以 forloop 内的多线程应该是一个好的解决方案吗?

可能是,可能不是。

让我们看看事实:

有时完成此过程大约需要 1 小时

就其本身而言,这应该不是问题。一小时不是很长的时间,特别是因为你可能有大约 12 小时的时间来做这件事。

并且多线程不一定会显着减少经过的时间。这取决于任务的性质、处理算法以及硬件和系统配置的性质。

有时会导致一些错误,它在导致(什么?)之间崩溃。

多线程不会解决这个问题。如果您让每个公司都在单独的线程中运行,那么同样的错误仍然会导致该线程崩溃。并且根据错误的原因和错误的后果,一家公司的崩溃也可能导致其他公司崩溃……或导致它们以其他方式无法正常工作。

我必须手动重新启动它,它会处理所有剩余的公司分析。

线程也不能完全解决这个问题。

您仍然需要修复导致原始崩溃的问题,然后手动重新启动。而且您仍然存在区分和记录需要重新运行的公司的问题,这样您就不会不必要地重复另一个。

总之,多线程可以使应用程序运行得更快(它可能会 IMO),但我真的不认为它会解决你的根本问题......这似乎是错误的数据或导致处理失败的错误.


最后,在技术层面上,简单地为每个公司启动一个线程可能是一个坏主意。如果您尝试并行完成工作,线程将竞争本地资源和后端数据库上的资源。最好使用具有有限池大小的 ThreadPoolExecutor 之类的东西。

于 2012-09-22T03:11:20.653 回答
0

为什么不为错误处理添加一个包装器......记录它并在出现错误时继续......这样你就不必重新启动以防出现错误。

for( your company list){
try{
    your tasks
}catch(Exception){
//log error and proceed

}

您的任务是否独立于您的公司列表?如果是这样,您可以创建新线程来处理每个任务。如果不是,您可以按所需顺序依次处理它们

于 2012-09-22T01:51:28.220 回答