我看到这里有很多答案,但我认为最简单的答案就是回答本身:
因为编写轮询循环通常比创建回调基础设施更加简单。
然后,您可以获得更简单的代码,如果它后来成为瓶颈,可以轻松理解并重新设计/重构为其他东西。
我同意避免轮询是一个好的策略。然而,关于Robert's post,我认为在这些问题不是很严重的情况下,轮询的简单性可以使其成为更好的方法,因为异步方法通常较难阅读和维护,更不用说可能会出现的实现错误。
就像所有事情一样,这取决于具体情况。我目前正在处理的一个大型高交易系统使用了一个带有SQL通知的方法(在某些表的触发器中调用扩展存储过程的DLL被加载到SQL Server中,然后该DLL通知其他应用程序有工作要做)。
然而,我们正在逐渐摆脱这种方法,因为我们可以几乎保证会不断有工作需要处理。因此,为了降低复杂性并稍微加快速度,应用程序将处理它们的工作并立即再次轮询数据库以获取新的工作。如果没有新工作,它将在短时间间隔后再次尝试。
这似乎更快且更简单。然而,应用程序的另一部分,交易量较低,使用这种方法并没有提高速度 - 除非轮询间隔非常小,这会导致性能问题。因此,对于这部分,我们将其保持原样。因此,当适用时,这是一件好事,但每个人的需求都不同。
当考虑SQL轮询时,在VB6时代,您可以使用WithEvents关键字创建记录集,这是异步“监听”的早期版本。
我个人总是会寻找一种事件驱动的实现方式,而不是轮询。如果失败,以下任何一种手动实现可能会有所帮助:
其中一些可能需要对项目进行轻微重新设计,但在企业世界中,这可能是比轮询服务更好的路线。
大多数回答都认为异步/消息传递通常更好,我完全同意Robert Gould的答案。但我想再补充一点。
其中一个优点是轮询可以一举两得。在一个特定的用例中,我参与的一个项目在数据库之间使用了消息队列,但从应用服务器到其中一个数据库进行轮询。由于应用程序服务器到数据库的网络偶尔会出现问题,因此还使用了轮询来通知应用程序网络问题。
最终,根据可扩展性考虑,使用对该用例最有意义的方法。
这里有一个关于推拉模式的优缺点的好总结: https://stpeter.im/index.php/2007/12/14/push-and-pull-in-application-architectures/
我希望我能够进一步概括这个答案,但有些事情最好不要删减。
我正在使用轮询来检查文件更新,因为我需要在不同操作系统类型的异构系统中获取有关该文件的信息,其中一个非常古老。如果文件位于具有不同操作系统的远程系统上,则 Linux 的通知将无法工作,因为该信息未传输,但轮询可以正常工作。这是一种低带宽检查,因此不会对任何事情造成影响。