我每晚都有一个流程运行,并为一组公司进行大量的数据分析。我这样做只是在一个贯穿公司列表的for循环中。有时这个过程需要大约1个小时才能完成。有时会导致一些错误,导致之间崩溃。我必须手动重启它,它处理所有剩余公司的分析。
由于每个for循环运行一个单独的公司的数据分析应该在for循环中进行多线程是一个很好的解决方案吗?
感谢您的任何建议。
答案 0 :(得分:4)
ThreadPoolExecutor是你的朋友!
答案 1 :(得分:2)
由于每个for循环运行一个单独的公司的数据分析应该是forloop内的多线程是一个很好的解决方案吗?
也许是的,也许不是。
让我们看看事实:
有时完成此过程大约需要1小时
本身,这应该不是问题。一小时不是很长的时间,特别是因为你可能有一个~12小时的窗口来做它。
多线程赢得必然显着减少了已用时间。这取决于任务的性质,处理算法以及硬件和系统配置的性质。
有时会导致某些错误,导致(什么?)之间崩溃。
多线程无法解决这个问题。如果你在一个单独的线程中运行每个公司,那么相同的错误仍然会导致该线程崩溃。根据错误的原因以及错误的后果,一家公司的崩溃也可能导致其他公司崩溃......或导致它们无法正常工作其他方式。
我必须手动重新启动它,它会处理所有剩余公司的分析。
线程也不会完全解决这个问题。
您仍然需要修复导致原始崩溃的问题,然后手动重启。而且你仍然存在区分和记录需要重新运行的公司的问题,这样你就不会不必要地重复其他公司。
总之,多线程可以使应用程序更快(可能是IMO),但我真的不认为它会解决你的根本问题......这似乎是坏数据或错误导致处理失败。
最后,在技术层面上,简单地为每个公司发起一个线程可能是一个坏主意。如果您尝试并行执行工作,则线程将在后端数据库上竞争本地资源和资源。使用具有有限池大小的ThreadPoolExecutor可能更好。
答案 2 :(得分:0)
为什么不为错误处理添加一个包装器...记录它并继续进行错误...这样你就不必重新启动错误。
for( your company list){
try{
your tasks
}catch(Exception){
//log error and proceed
}
您的任务是否独立于您的公司列表? 如果是这样,您可以创建新线程来处理每个任务。 如果没有,您可以按要求的顺序处理它们