线程是否有利于这种情况?

时间:2013-02-21 15:07:49

标签: ruby multithreading mongodb

我有一个超过100万行的CSV文件。我还有一个数据库,以格式化的方式包含这些数据。

我想检查并验证CSV文件中的数据和数据库中的数据。

是否有益/缩短从CSV文件读取线程并使用连接池到数据库的时间?

Ruby如何处理线程?

我也在使用MongoDB。

1 个答案:

答案 0 :(得分:4)

如果不了解有关某人发起此比较时您希望该应用感受到的具体细节,则很难说。因此,要回答一些一般性建议,无论您可能想要解决的问题如何都应该适用。

线程不会使计算成本降低的成本

线程在计算时间方面不会降低成本。它只是让两件事并行发生。所以,要注意你没有陷入常见的误解,“线程使我的应用更快,因为用户不等待事情。” - 事实并非如此,线程实际上增加了相当多的复杂性。

因此,如果您启动此DB与CSV比较任务,则线程不会使该比较花费更少的时间。它可能做的是让你告诉用户,“好吧,我会立即为你检查”,同时在一个单独的执行线程中进行比较。您仍需要弄清楚在比较完成后如何回复用户。

想想你想要解决的问题,而不是简单地将其视为线程是否是长期任务的良好解决方案

就像我上面所说的那样,线程化不会让事情变得更快。充其量,它以更高效的方式使用计算资源,或者提供更好的用户体验,或两者兼而有之。

如果应用程序的用户(可能只是你)不介意等待比较运行,那么不要添加线程,因为你只是要增加复杂性而且不会更快。如果这种比较需要很长时间,而你宁愿“在后台进行”,那么线程可能可以成为你的答案。请注意,如果您这样做,那么您将添加另一个问题,即在后台作业完成后如何更新用户?

线程涉及额外的开销和应用程序复杂性,然后您必须在应用程序中管理 - 轻轻一点

还有其他问题,例如,如何安排该工作线程以确保它不会占用计算资源?线程优先级的设置是否在我的环境中是一个选项,如果是,那么调整它们将如何影响计算资源的使用?

线程和所涉及的额外开销几乎肯定会使您的比较变得更长(就进行比较所花费的绝对时间而言)。真正的好处是,如果您不关心完成时间(比较开始和完成之间的时间),而是关注应用程序对用户的响应性,和/或可以实现的总吞吐量(例如,您可以运行的同时比较的数量,因此您可以在给定的时间跨度内完成比较的总数。)

线程不保证您的可用CPU核心有效使用

请参阅Green Threads与本机线程 - 某些语言(取决于其线程实现)可以跨CPU调度线程。

线程并不一定意味着您的线程最终会在多个物理CPU核心中运行 - 实际上在很多情况下它们肯定不会。如果所有应用程序的线程都在同一个物理内核上运行,那么它们并不是真正并行运行 - 它们只是以一种可能使它们看起来像并行运行的方式分配CPU时间。

由于这些原因,根据应用程序的结构,将后台任务发送到单独的工作人员进程(进程,而不是线程)通常不那么复杂,可以轻松地将其安排到可用的CPU上操作系统级别的核心。单独的进程(与单独的线程相对)也消除了应用程序中的许多调度问题,因为您实际上卸载了有关如何将内容安排到操作系统本身的决定。

最后一点非常重要。操作系统调度程序非常可能比您在应用程序中提出的算法更智能,更高效。