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